xndt > 08-05-17, 11:35 AM
maidinhdan > 08-05-17, 10:05 PM
(08-05-17, 11:35 AM)xndt Đã viết: Tôi có đoạn mã ở dưới. Vấn đề ở chỗ khi đọc số m2 bị lỗi hiện tượng sau:
- VD1: 42 m2 nó đọc là: (Bốn mươi hai phẩy không m2) cái này rất đúng;
- VD1: 42,7 m2 nó đọc thành (Bốn mươi hai phẩy bảy mươi m2)
- VD2: 42, 73 m2 nó đọc thành (Bốn mươi hai phẩy bảy mươi ba m2)
- VD4: 42,1 m2 nó đọc thành[i] (Bốn mươi hai phẩy mươi m2)[/i]
Tôi chỉ muốn nó đọc là (Bốn mươi hai phẩy bảy m2) hoặc (Bốn mươi hai phẩy bảy ba m2) hoặc[i] [i](Bốn mươi hai phẩy một m2)[/i][/i]
Mong các cao thủ giúp đỡ.
xndt > 09-05-17, 05:47 PM
tranthanhan1962 > 09-05-17, 07:48 PM
(09-05-17, 05:47 PM)xndt Đã viết: Cám ơn bạn maidinhdan nhiều! vấn đề là bạn có thể giúp tôi cái: VD4: 42,1 m2 nó đọc thành[i] (Bốn mươi hai phẩy mươi m2) được không?[/i]Để làm được điều này phải viết một mod khác chứ không sửa được bạn ạ! Mod đọc số thành chữ là một mod rất khó, rất phức tạp nên cũng không phải ai có đủ thời gian và kiên nhẫn để viết đâu bạn. Mod bạn đang sử dụng là của bác Ông Văn Thông viết (bác Thông là tổ sư bồ đề access đấy bạn). Mod này ngày xưa bác Thông viết cho font VNI sau này khi sử dụng font Unicode thì bị lỗi, vì thể nhiều người sử dụng cố gắng viết các mod khác nhưng không mod nào hoàn chỉnh như mod này bác Thông. Mình cũng sử dụng mod này để đọc số bằng cách dịch mã font Unicode rồi chuyển vào sử các từ đọc số. Do bác Thông sử định dang số để dịch nên dù bạn có sử dụng #.000,# thì khi chạy code nó vẫn chuyển thành #.000,00 như bạn Dân nói và không xử lý kiểu của bạn được. Bạn muốn viết mod theo ý bạn thì phải dùng chuyễn sang định text, nhưng nếu chuyển sang định dạng text mà format số kiểu Mỹ 0,000.00 thì code sẽ dịch bậy. Một và hai con số lẽ của bạn không đơn giản đâu.
nhannt4 > 10-05-17, 04:41 PM
(08-05-17, 11:35 AM)xndt Đã viết: Tôi có đoạn mã ở dưới. Vấn đề ở chỗ khi đọc số m2 bị lỗi hiện tượng sau:
- VD1: 42 m2 nó đọc là: (Bốn mươi hai phẩy không m2) cái này rất đúng;
- VD1: 42,7 m2 nó đọc thành (Bốn mươi hai phẩy bảy mươi m2)
- VD2: 42, 73 m2 nó đọc thành (Bốn mươi hai phẩy bảy mươi ba m2)
- VD4: 42,1 m2 nó đọc thành[i] (Bốn mươi hai phẩy mươi m2)[/i]
Tôi chỉ muốn nó đọc là (Bốn mươi hai phẩy bảy m2) hoặc (Bốn mươi hai phẩy bảy ba m2) hoặc[i] [i](Bốn mươi hai phẩy một m2)[/i][/i]
Mong các cao thủ giúp đỡ.
Public Function MET2(SoLuong)
Dim KetQua, SoTien, Nhom, Chu, Dich, S1, S2, S3 As String
Dim n, k, ViTri As Byte, S As Double
Dim Hang, DonVi, Dem
If SoLuong = 0 Then '1
KetQua = "Không m2"
Else
If Abs(SoLuong) > 1E+15 Then '2
KetQua = "Số quá lớn"
Else
If SoLuong < 0 Then
KetQua = "Trừ" & Space(1)
Else
KetQua = Space(0)
End If
SoTien = Format(Abs(SoLuong), "#################0.00")
SoTien = Right(Space(15) & SoTien, 18)
Hang = Array("None", "trăm", "mươi", "gì đó")
DonVi = Array("None", "ngàn tỷ", "tỷ", "triệu", "ngàn", "phẩy", "m2")
Dem = Array("None", "một", "hai", "ba", "bốn", "năm", "sáu", "bảy", "tám", "chín")
For n = 1 To 6
Nhom = Mid(SoTien, n * 3 - 2, 3)
If Nhom <> Space(3) Then
Select Case Nhom
Case "000"
If n = 5 Then
Chu = "phẩy" & Space(1)
'Chu = "m2" & Space(1)
Else
Chu = Space(0)
End If
Case ".00", ",00"
Chu = "không m2"
Case Else
S1 = Left(Nhom, 1): S2 = Mid(Nhom, 2, 1): S3 = Right(Nhom, 1)
Chu = Space(0): Hang(3) = DonVi(n)
For k = 1 To 3
Dich = Space(0): S = Val(Mid(Nhom, k, 1))
If S > 0 Then
Dich = Dem(S) & Space(1) & Hang(k) & Space(1)
Else
If k = 1 And n > 1 And n < 6 And Val(Mid(SoTien, (n - 1) * 3 - 2, 3)) > 0 Then
Dich = "không" & Space(1) & Hang(k) & Space(1)
End If
End If
Select Case k
Case 2 And S = 1
Dich = "mươì" & Space(1)
Case 3 And S = 0 And Nhom <> Space(2) & "0"
Dich = Hang(k) & Space(1)
Case 3 And S = 5 And Val(S2) > 0
Dich = "l" & Mid(Dich, 2)
Case 2 And S = 0 And S3 <> "0"
If n > 1 And Val(Mid(SoTien, (n - 1) * 3 - 2, 3)) > 0 Or (Val(S1) > 0) Then
Dich = "không" & Space(1)
End If
End Select
Chu = Chu & Dich
Next k
End Select
ViTri = InStr(1, Chu, "mươi một")
If ViTri > 0 Then
Mid(Chu, ViTri, 9) = "mươi mốt"
End If
KetQua = KetQua & Chu
End If '4
Next n
End If '2
End If '1
MET2 = UCase(Left(KetQua, 1)) & Trim(Mid(KetQua, 2))
End Function
Option Compare Database
Public Function metvuong(ByVal giatriso) As String
Dim giatri As String
Dim S1, S2, docphannguyen, docphanle As String
giatri = Format(Abs(giatriso), "##0.00")
S1 = Left(giatri, InStr(giatri, ",") - 1)
docphannguyen = DocSoUni(S1)
S2 = Right(giatri, 2)
Select Case S2
Case "00"
docphanle = DocSoUni("0")
Case Else
If Left(S2, 1) = "0" Then
docphanle = DocSoUni("0") & " " & DocSoUni(Right(S2, 1))
Else
If Right(S2, 1) = "0" Then
docphanle = DocSoUni(Left(S2, 1))
Else
docphanle = DocSoUni(S2)
End If
End If
End Select
metvuong = docphannguyen & " " & Form_Frtest.lbPhay.Caption & " " & docphanle & " " & Form_Frtest.lbM2.Caption
metvuong = Inhoachucaidau(metvuong)
End Function
Public Function DocSoUni(ByVal conso) As String
s09 = Array("", " m" & ChrW(7897) & "t", " hai", " ba", " b" & ChrW(7889) & "n", " n" & ChrW(259) & "m", " s" & ChrW(225) & "u", " b" & ChrW(7843) & "y", " t" & ChrW(225) & "m", " ch" & ChrW(237) & "n")
lop3 = Array("", " tri" & ChrW(7879) & "u", " ngh" & ChrW(236) & "n", " t" & ChrW(7927))
Dim docso, s123 As String
If Trim(conso) = "" Then
DocSoUni = ""
ElseIf IsNumeric(conso) = True Then
If conso < 0 Then dau = ChrW(226) & "m " Else dau = ""
conso = Abs(conso)
conso = " " & conso
conso = Replace(conso, ",", "", 1)
vt = InStr(1, conso, "E")
If vt > 0 Then
sonhan = Val(Mid(conso, vt + 1))
conso = Trim(Mid(conso, 2, vt - 2))
conso = conso & String(sonhan - Len(conso) + 1, "0")
End If
conso = Trim(conso)
sochuso = Len(conso) Mod 9
If sochuso > 0 Then conso = String(9 - (sochuso Mod 12), "0") & conso
docso = ""
i = 1
lop = 1
Do
n1 = Mid(conso, i, 1)
n2 = Mid(conso, i + 1, 1)
n3 = Mid(conso, i + 2, 1)
baso = Mid(conso, i, 3)
i = i + 3
If n1 & n2 & n3 = "000" Then
If docso <> "" And lop = 3 And Len(conso) - i > 2 Then s123 = " t" & ChrW(7927) Else s123 = ""
Else
If n1 = 0 Then
If docso = "" Then S1 = "" Else S1 = " kh" & ChrW(244) & "ng tr" & ChrW(259) & "m"
Else
S1 = s09(n1) & " tr" & ChrW(259) & "m"
End If
If n2 = 0 Then
If S1 = "" Or n3 = 0 Then
S2 = ""
Else
S2 = " l" & ChrW(7867)
End If
Else
If n2 = 1 Then S2 = " m" & ChrW(432) & ChrW(7901) & "i" Else S2 = s09(n2) & " m" & ChrW(432) & ChrW(417) & "i"
End If
If n3 = 1 Then
If n2 = 1 Or n2 = 0 Then S3 = " m" & ChrW(7897) & "t" Else S3 = " m" & ChrW(7889) & "t"
ElseIf n3 = 5 And n2 <> 0 Then
S3 = " l" & ChrW(259) & "m"
Else
S3 = s09(n3)
End If
If i > Len(conso) Then
s123 = S1 & S2 & S3
Else
s123 = S1 & S2 & S3 & lop3(lop)
End If
End If
lop = lop + 1
If lop > 3 Then lop = 1
docso = docso & s123
If i > Len(conso) Then Exit Do
Loop
If docso = "" Then DocSoUni = "kh" & ChrW(244) & "ng" Else DocSoUni = dau & Trim(docso)
Else
DocSoUni = conso
End If
End Function
Function Inhoachucaidau(Word As Variant) As String
Dim temp As String
If IsNull(Word) Then
Exit Function
Else
temp = CStr(LCase(LTrim(Word)))
Inhoachucaidau = UCase(Left(temp, 1)) & Right(temp, Len(temp) - 1)
End If
End Function
xndt > 10-05-17, 05:44 PM
(10-05-17, 04:41 PM)nhannt4 Đã viết:(08-05-17, 11:35 AM)xndt Đã viết: Tôi có đoạn mã ở dưới. Vấn đề ở chỗ khi đọc số m2 bị lỗi hiện tượng sau:
- VD1: 42 m2 nó đọc là: (Bốn mươi hai phẩy không m2) cái này rất đúng;
- VD1: 42,7 m2 nó đọc thành (Bốn mươi hai phẩy bảy mươi m2)
- VD2: 42, 73 m2 nó đọc thành (Bốn mươi hai phẩy bảy mươi ba m2)
- VD4: 42,1 m2 nó đọc thành[i] (Bốn mươi hai phẩy mươi m2)[/i]
Tôi chỉ muốn nó đọc là (Bốn mươi hai phẩy bảy m2) hoặc (Bốn mươi hai phẩy bảy ba m2) hoặc[i] [i](Bốn mươi hai phẩy một m2)[/i][/i]
Mong các cao thủ giúp đỡ.
Public Function MET2(SoLuong)
Dim KetQua, SoTien, Nhom, Chu, Dich, S1, S2, S3 As String
Dim n, k, ViTri As Byte, S As Double
Dim Hang, DonVi, Dem
If SoLuong = 0 Then '1
KetQua = "Không m2"
Else
If Abs(SoLuong) > 1E+15 Then '2
KetQua = "Số quá lớn"
Else
If SoLuong < 0 Then
KetQua = "Trừ" & Space(1)
Else
KetQua = Space(0)
End If
SoTien = Format(Abs(SoLuong), "#################0.00")
SoTien = Right(Space(15) & SoTien, 18)
Hang = Array("None", "trăm", "mươi", "gì đó")
DonVi = Array("None", "ngàn tỷ", "tỷ", "triệu", "ngàn", "phẩy", "m2")
Dem = Array("None", "một", "hai", "ba", "bốn", "năm", "sáu", "bảy", "tám", "chín")
For n = 1 To 6
Nhom = Mid(SoTien, n * 3 - 2, 3)
If Nhom <> Space(3) Then
Select Case Nhom
Case "000"
If n = 5 Then
Chu = "phẩy" & Space(1)
'Chu = "m2" & Space(1)
Else
Chu = Space(0)
End If
Case ".00", ",00"
Chu = "không m2"
Case Else
S1 = Left(Nhom, 1): S2 = Mid(Nhom, 2, 1): S3 = Right(Nhom, 1)
Chu = Space(0): Hang(3) = DonVi(n)
For k = 1 To 3
Dich = Space(0): S = Val(Mid(Nhom, k, 1))
If S > 0 Then
Dich = Dem(S) & Space(1) & Hang(k) & Space(1)
Else
If k = 1 And n > 1 And n < 6 And Val(Mid(SoTien, (n - 1) * 3 - 2, 3)) > 0 Then
Dich = "không" & Space(1) & Hang(k) & Space(1)
End If
End If
Select Case k
Case 2 And S = 1
Dich = "mươì" & Space(1)
Case 3 And S = 0 And Nhom <> Space(2) & "0"
Dich = Hang(k) & Space(1)
Case 3 And S = 5 And Val(S2) > 0
Dich = "l" & Mid(Dich, 2)
Case 2 And S = 0 And S3 <> "0"
If n > 1 And Val(Mid(SoTien, (n - 1) * 3 - 2, 3)) > 0 Or (Val(S1) > 0) Then
Dich = "không" & Space(1)
End If
End Select
Chu = Chu & Dich
Next k
End Select
ViTri = InStr(1, Chu, "mươi một")
If ViTri > 0 Then
Mid(Chu, ViTri, 9) = "mươi mốt"
End If
KetQua = KetQua & Chu
End If '4
Next n
End If '2
End If '1
MET2 = UCase(Left(KetQua, 1)) & Trim(Mid(KetQua, 2))
End Function
Bạn xem các Module sau có phải bạn đang cần:
Mã PHP:Option Compare Database
Public Function metvuong(ByVal giatriso) As String
Dim giatri As String
Dim S1, S2, docphannguyen, docphanle As String
giatri = Format(Abs(giatriso), "##0.00")
S1 = Left(giatri, InStr(giatri, ",") - 1)
docphannguyen = DocSoUni(S1)
S2 = Right(giatri, 2)
Select Case S2
Case "00"
docphanle = DocSoUni("0")
Case Else
If Left(S2, 1) = "0" Then
docphanle = DocSoUni("0") & " " & DocSoUni(Right(S2, 1))
Else
If Right(S2, 1) = "0" Then
docphanle = DocSoUni(Left(S2, 1))
Else
docphanle = DocSoUni(S2)
End If
End If
End Select
metvuong = docphannguyen & " " & Form_Frtest.lbPhay.Caption & " " & docphanle & " " & Form_Frtest.lbM2.Caption
metvuong = Inhoachucaidau(metvuong)
End Function
Public Function DocSoUni(ByVal conso) As String
s09 = Array("", " m" & ChrW(7897) & "t", " hai", " ba", " b" & ChrW(7889) & "n", " n" & ChrW(259) & "m", " s" & ChrW(225) & "u", " b" & ChrW(7843) & "y", " t" & ChrW(225) & "m", " ch" & ChrW(237) & "n")
lop3 = Array("", " tri" & ChrW(7879) & "u", " ngh" & ChrW(236) & "n", " t" & ChrW(7927))
Dim docso, s123 As String
If Trim(conso) = "" Then
DocSoUni = ""
ElseIf IsNumeric(conso) = True Then
If conso < 0 Then dau = ChrW(226) & "m " Else dau = ""
conso = Abs(conso)
conso = " " & conso
conso = Replace(conso, ",", "", 1)
vt = InStr(1, conso, "E")
If vt > 0 Then
sonhan = Val(Mid(conso, vt + 1))
conso = Trim(Mid(conso, 2, vt - 2))
conso = conso & String(sonhan - Len(conso) + 1, "0")
End If
conso = Trim(conso)
sochuso = Len(conso) Mod 9
If sochuso > 0 Then conso = String(9 - (sochuso Mod 12), "0") & conso
docso = ""
i = 1
lop = 1
Do
n1 = Mid(conso, i, 1)
n2 = Mid(conso, i + 1, 1)
n3 = Mid(conso, i + 2, 1)
baso = Mid(conso, i, 3)
i = i + 3
If n1 & n2 & n3 = "000" Then
If docso <> "" And lop = 3 And Len(conso) - i > 2 Then s123 = " t" & ChrW(7927) Else s123 = ""
Else
If n1 = 0 Then
If docso = "" Then S1 = "" Else S1 = " kh" & ChrW(244) & "ng tr" & ChrW(259) & "m"
Else
S1 = s09(n1) & " tr" & ChrW(259) & "m"
End If
If n2 = 0 Then
If S1 = "" Or n3 = 0 Then
S2 = ""
Else
S2 = " l" & ChrW(7867)
End If
Else
If n2 = 1 Then S2 = " m" & ChrW(432) & ChrW(7901) & "i" Else S2 = s09(n2) & " m" & ChrW(432) & ChrW(417) & "i"
End If
If n3 = 1 Then
If n2 = 1 Or n2 = 0 Then S3 = " m" & ChrW(7897) & "t" Else S3 = " m" & ChrW(7889) & "t"
ElseIf n3 = 5 And n2 <> 0 Then
S3 = " l" & ChrW(259) & "m"
Else
S3 = s09(n3)
End If
If i > Len(conso) Then
s123 = S1 & S2 & S3
Else
s123 = S1 & S2 & S3 & lop3(lop)
End If
End If
lop = lop + 1
If lop > 3 Then lop = 1
docso = docso & s123
If i > Len(conso) Then Exit Do
Loop
If docso = "" Then DocSoUni = "kh" & ChrW(244) & "ng" Else DocSoUni = dau & Trim(docso)
Else
DocSoUni = conso
End If
End Function
Function Inhoachucaidau(Word As Variant) As String
Dim temp As String
If IsNull(Word) Then
Exit Function
Else
temp = CStr(LCase(LTrim(Word)))
Inhoachucaidau = UCase(Left(temp, 1)) & Right(temp, Len(temp) - 1)
End If
End Function
File Demo.
nhannt4 > 10-05-17, 05:54 PM
(10-05-17, 05:44 PM)xndt Đã viết: Hình như nó không đọc được bạn ơi!
ongke0711 > 10-05-17, 06:58 PM
xndt > 11-05-17, 10:16 AM
(10-05-17, 05:54 PM)nhannt4 Đã viết:(10-05-17, 05:44 PM)xndt Đã viết: Hình như nó không đọc được bạn ơi!
Bạn download file Demo của mình về sử dụng xem, máy mình sử dụng định dạng ngày đã điều chỉnh lại chứ không để mặc định nên bạn có thể mở code trong file Demo để điều chỉnh lại cho phù hợp:
- Decimal symbol: dấu ","
- Digit grouping symbol: dấu "."
Máy mình đã test hoạt động tốt.
(Mở file demo xem rõ hơn).
nhannt4 > 11-05-17, 11:00 AM
(11-05-17, 10:16 AM)xndt Đã viết: Cám ơn bạn rất nhiều! nó đã đúng cái tôi cần luôn, nhưng tôi có vấn đề cần bạn giúp như sau:
Do máy của tôi còn phải dùng 1 phần mềm quan trọng phải sử dụng định dạng ngày mặc định nên bạn có thể giúp tôi điều chỉnh code cho nó sử dụng được với ngày mặc định của Windows được không, nếu được thì tốt quá. Thanks bạn nhiều.