Tên chương trình:
Ngôn ngữ lập trình: Visual Basic 2005
Tác giả: Hồ Minh Đạt - 9/5 - THCS Nguyễn Hiền
Chức năng:
module này có thể chuyển 1 số thành cách đọc trong tiếng việt và cả tiếng anh nữa
Module ReadNumber
' hàm này có phạm vi đọc là 21 chữ số, [vb][vbnet]
[/vb]tương ứng với 7 lớp
Private donvi(0 To 1, 0 To 10)
'Thủ tục Load() gán giá trị cho biến mảng Donvi (0 to 10) chứa các tên gọi số
Private Sub load()
donvi(1, 0) = ""
donvi(1, 1) = "một"
donvi(1, 2) = "hai"
donvi(1, 3) = "ba"
donvi(1, 4) = "bốn"
donvi(1, 5) = "năm"
donvi(1, 6) = "sáu"
donvi(1, 7) = "bảy"
donvi(1, 8) = "tám"
donvi(1, 9) = "chín"
donvi(1, 10) = "mười"
donvi(0, 0) = ""
donvi(0, 1) = "one"
donvi(0, 2) = "two"
donvi(0, 3) = "three"
donvi(0, 4) = "four"
donvi(0, 5) = "five"
donvi(0, 6) = "six"
donvi(0, 7) = "seven"
donvi(0, 8) = "eight"
donvi(0, 9) = "nine"
donvi(0, 10) = "ten"
End Sub
' hàm Copy sẽ sao chép một chuổi con từ chuổi mẹ
Function copy(ByVal st As String, ByVal start As Integer, ByVal length As Integer) As String
Dim ll
ll = Microsoft.VisualBasic.Left(st, start + length)
Dim r
r = Microsoft.VisualBasic.Right(ll, length)
copy = r
End Function
' hàm nay loạt bỏ các kí tự không phải là chữ số
Function lamDepSo(ByVal strnumber As String) As String
Dim i
Dim outString As String = ""
' 0..9 có mã ASCII là 48..58
For i = 0 To Len(strnumber) - 1
If (Asc(strnumber(i)) > 47) And (Asc(strnumber(i)) < 59) Then
outString = outString + strnumber(i)
End If
Next
lamDepSo = outString
End Function
'---------------------------------------------------------------------------------------
'đọc số hàng chục của tiếng Anh
Function docHangChucEnglish(ByVal number As String) As String
Dim num = CInt(number)
Dim TextOut As String = ""
Dim donV, chuc
donV = donvi(0, num Mod 10) ' chữ số hàm đơn vị { lưu ý là chỉ lấy 1 số vào trả về tên gọi}
chuc = donvi(0, (num Mod 100) \ 10) ' chữ số hàng trăm
Select Case num
Case 10
TextOut = "ten"
Case 11
TextOut = "eleven "
Case 12
TextOut = "twelve"
Case 13
TextOut = "thirteen"
Case 14 To 19
If num = 15 Then
TextOut = "fifteen"
Else
TextOut = donV & "teen"
End If
Case 20 To 29
TextOut = " twenty " & donV
Case 30 To 59
If num = 30 Then
TextOut = " thirty "
Else
If num = 50 Then TextOut = " fifty "
Select Case num
Case 31 To 39
TextOut = " thirty " & donV
Case 40 To 49
TextOut = " fourty " & donV
Case 50 To 59
TextOut = " fifty " & donV
End Select
End If
Case 60 To 99
If num > 79 And num < 90 Then ' trường hợp so 80 viết có 2 chữ "t"
TextOut = " eighty " & donV
Else
TextOut = chuc & "ty " & donV
End If
End Select
docHangChucEnglish = TextOut ' trả giá trị cho hàm
End Function
'đọc số hàng chục của tiếng việt
Function docHangChuc(ByVal number As String) As String
Dim num = CInt(number)
Dim TextOut As String = ""
Dim donV, chuc
donV = donvi(1, num Mod 10) ' chữ số hàm đơn vị { lưu ý là chỉ lấy 1 số vào trả về tên gọi}
chuc = donvi(1, (num Mod 100) \ 10) ' chữ số hàng trăm
Select Case num
Case 10
TextOut = "mười"
Case 11 To 19
TextOut = "mười " & donV
Case 20 To 99
If num Mod 10 = 1 Then ' các số có tận cùng là số 1, đọc là "mốt"
TextOut = chuc & " mươi mốt"
Else
If num Mod 10 <> 5 Then
TextOut = chuc & " mươi " & donV
Else ' các số có tận cùng là số 5 , đọc là "lăm"
TextOut = chuc & " mươi lăm"
End If
End If
End Select
docHangChuc = TextOut ' trả giá trị cho hàm
End Function
'doc so từ 1..99
Function ReadNumber(ByVal lan As Integer, ByVal number As String) As String
Dim TextOut As String = ""
Dim num = number
Dim donV, chuc, tram
donV = donvi(lan, num Mod 10)
chuc = donvi(lan, (num Mod 100) \ 10)
tram = donvi(lan, (num Mod 1000) \ 100)
'đọc tiếng Việt
If lan = 0 Then
Select Case num
Case 0
TextOut = "Zero"
Case 1 To 9
TextOut = donV
Case 10 To 99
TextOut = docHangChucEnglish(num)
Case 100 To 999
If num Mod 100 = 0 Then TextOut = tram & " hundred and "
If ((num Mod 100) \ 10) = 0 Then
TextOut = tram & " hundred and " & donV
Else
TextOut = tram & " hundred and " & docHangChucEnglish(num Mod 100)
End If
End Select
End If
'đọc tiếng Anh
If lan = 1 Then
Select Case num
Case 0
TextOut = "không"
Case 1 To 9
TextOut = donV
Case 10 To 99
TextOut = docHangChuc(num)
Case 100 To 999
If num Mod 100 = 0 Then TextOut = tram & " trăm"
If ((num Mod 100) \ 10) = 0 Then
TextOut = tram & " trăm lẻ " & donV
Else
TextOut = tram & " trăm " & docHangChuc(num Mod 100)
End If
End Select
End If
ReadNumber = TextOut
End Function
'dùng hàm nay để chuyển đổi số thành lời. tham số 'Lan' là trị số qui định ngôn ngữ Anh hay việt
' quy ước: 1 là tiếng Việt
' 0 là tiếng Anh
Function ConvertNumToString(ByVal Lan As Integer, ByVal strnumberInput As String) As String
Dim TextInput = lamDepSo(strnumberInput) ' xu li so nhap vao
ConvertNumToString = ""
If TextInput = "" Or Len(TextInput) > 21 Then
ConvertNumToString = "Too large number or not enter number"
Exit Function
End If
Dim temp = ""
If strnumberInput(0) = "-" Then
If Lan = 1 Then
temp = "Âm "
Else
temp = "Ninus "
End If
End If
load() ' gan gia trị cho các biến mảng
Dim i, vitri, sokitu, solop
Dim MangLop(0 To 7) ' lưu trữ 3 số trên một phần tử
Dim MangTenLop(0 To 1, 0 To 7) ' lưu trữ tên các lớp của số
MangTenLop(0, 0) = "" 'lớp 0 không tồn tại
MangTenLop(0, 1) = "" 'lớp thứ 1 có 3 chữ số tức là hàng trăm, nhưng ta đã sử lí số hàng trăm ở hàm readNumber rồi nên bỏ trống chổ này
MangTenLop(0, 2) = " thousand "
MangTenLop(0, 3) = " million "
MangTenLop(0, 4) = " bilion "
MangTenLop(0, 5) = " thousand bilion "
MangTenLop(0, 6) = " million bilion "
MangTenLop(0, 7) = " billion bilion "
MangTenLop(1, 0) = "" 'lớp 0 không tồn tại
MangTenLop(1, 1) = "" 'lớp thứ 1 có 3 chữ số tức là hàng trăm, nhưng ta đã sử lí số hàng trăm ở hàm readNumber rồi nên bỏ trống chổ này
MangTenLop(1, 2) = " nghìn "
MangTenLop(1, 3) = " triệu "
MangTenLop(1, 4) = " tỉ "
MangTenLop(1, 5) = " nghìn tỉ "
MangTenLop(1, 6) = " triệu tỉ "
MangTenLop(1, 7) = " tỉ tỉ "
' bạn có thể mở rộng thêm phạm vi đọc
' bằng cách thêm phần tử cho biến mảng MangTenLop
sokitu = Len(TextInput)
solop = sokitu \ 3
If sokitu Mod 3 > 0 Then solop += 1
If solop > 7 Then Exit Function
vitri = (sokitu Mod 3)
If (vitri = 0) And (solop >= 2) Then vitri = 3
If solop = 1 Then
MangLop(1) = TextInput
End If
If solop >= 2 Then
If sokitu Mod 3 <> 0 Then
MangLop(1) = copy(TextInput, 0, sokitu Mod 3)
Else
MangLop(1) = copy(TextInput, 0, 3) ' trường hợp số kí tự chia hết cho 3 thì không dùng công thức "sokitu Mod 3" để sát định số kí tụ ở lớp lớn nhất
End If
For i = 2 To solop
MangLop(i) = copy(TextInput, vitri, 3) ' sao chép các kí tự theo lớp vào mảng "MangLop()"
vitri += 3 'mổi lớp có 3 kí số nên phải tăng lên 3 ở vị trí copy tiếp theo
Next
Else
MangLop(2) = copy(TextInput, 1, 3) ' trường hợp có 2 lớp
End If
For i = 1 To solop ' đọc các số sau khi đã có 2 mảng cần thiết
temp = temp & ReadNumber(Lan, MangLop(i)) & MangTenLop(Lan, solop - i + 1)
Next
ConvertNumToString = temp
End Function
End Module
[/vbnet]
cách sử dụng
gọi hàm với tham số Lan=1 là tiếng việt lan=2 là tiếng anh
hàm này của em có thể đọc được số có tối đa
21 chữ số
lbVietNam.Text = ConvertNumToString(1, "123456789123456789123") 'tieng viet
LbEnglish.Text = ConvertNumToString(0, "123456789123456789123") 'chuyen sang tieng anh