供参考 下面是转化为汉字 请把 零:ZERO 壹:ONE 等做响应改动即可' 本模块生成汉字大写的金额 ' 名称: CCh ' 得到一位数字 N1 的汉字大写 ' 0 返回 "" Private Function CCh(N1) As String Select Case N1 Case 0 CCh = "零" Case 1 CCh = "壹" Case 2 CCh = "贰" Case 3 CCh = "叁" Case 4 CCh = "肆" Case 5 CCh = "伍" Case 6 CCh = "陆" Case 7 CCh = "柒" Case 8 CCh = "捌" Case 9 CCh = "玖" End Select End Function '名称: ChMoney ' 得到数字 N1 的汉字大写 ' 最大为 千万位 ' O 返回 "" Public Function ChMoney(N1) As String Dim tMoney As String Dim lMoney As String Dim tn '小数位置 Dim s1 As String '临时STRING 小数部分 Dim s2 As String '1000 以内 Dim s3 As String '10000If N1 = 0 Then ChMoney = " " Exit Function End If If N1 < 0 Then ChMoney = "负" + ChMoney(Abs(N1)) Exit Function End If tMoney = Trim(Str(N1)) tn = InStr(tMoney, ".") '小数位置 s1 = ""If tn <> 0 Then ST1 = Right(tMoney, Len(tMoney) - tn) If ST1 <> "" Then t1 = Left(ST1, 1) ST1 = Right(ST1, Len(ST1) - 1) If t1 <> "0" Then s1 = s1 + CCh(Val(t1)) + "角" End If If ST1 <> "" Then t1 = Left(ST1, 1) s1 = s1 + CCh(Val(t1)) + "分" End If End If ST1 = Left(tMoney, tn - 1) Else ST1 = tMoney End If s2 = "" If ST1 <> "" Then t1 = Right(ST1, 1) ST1 = Left(ST1, Len(ST1) - 1) s2 = CCh(Val(t1)) + s2 End IfIf ST1 <> "" Then t1 = Right(ST1, 1) ST1 = Left(ST1, Len(ST1) - 1) If t1 <> "0" Then s2 = CCh(Val(t1)) + "拾" + s2 Else If Left(s2, 1) <> "零" Then s2 = "零" + s2 End If End IfIf ST1 <> "" Then t1 = Right(ST1, 1) ST1 = Left(ST1, Len(ST1) - 1) If t1 <> "0" Then s2 = CCh(Val(t1)) + "佰" + s2 Else If Left(s2, 1) <> "零" Then s2 = "零" + s2 End If End IfIf ST1 <> "" Then t1 = Right(ST1, 1) ST1 = Left(ST1, Len(ST1) - 1) If t1 <> "0" Then s2 = CCh(Val(t1)) + "仟" + s2 Else If Left(s2, 1) <> "零" Then s2 = "零" + s2 End If End Ifs3 = "" If ST1 <> "" Then t1 = Right(ST1, 1) ST1 = Left(ST1, Len(ST1) - 1) s3 = CCh(Val(t1)) + s3 End If If ST1 <> "" Then t1 = Right(ST1, 1) ST1 = Left(ST1, Len(ST1) - 1) If t1 <> "0" Then s3 = CCh(Val(t1)) + "拾" + s3 Else If Left(s3, 1) <> "零" Then s3 = "零" + s3 End If End IfIf ST1 <> "" Then t1 = Right(ST1, 1) ST1 = Left(ST1, Len(ST1) - 1) If t1 <> "0" Then s3 = CCh(Val(t1)) + "佰" + s3 Else If Left(s3, 1) <> "零" Then s3 = "零" + s3 End If End IfIf ST1 <> "" Then t1 = Right(ST1, 1) ST1 = Left(ST1, Len(ST1) - 1) If t1 <> "0" Then s3 = CCh(Val(t1)) + "仟" + s3 End If End If If Right(s2, 1) = "零" Then s2 = Left(s2, Len(s2) - 1) If Len(s3) > 0 Then If Right(s3, 1) = "零" Then s3 = Left(s3, Len(s3) - 1) s3 = s3 & "万" End IfChMoney = IIf(s3 & s2 = "", s1, s3 & s2 & "元" & s1)End Function
楼上的不行的,TWENTY<---->TWO TEN??? ,"万"??? 只好自己编一个了。
Option Explicit Public Function numtoword(numstr As Variant) As String '---------------------------------------------------- ' The best data type to feed in is ' Decimal, but it is up to you '---------------------------------------------------- Dim tempstr As String Dim newstr As String numstr = CDec(numstr)If numstr = 0 Then numtoword = "zero " Exit Function End IfIf numstr > 10 ^ 24 Then numtoword = "Too big" Exit Function End IfIf numstr >= 10 ^ 12 Then newstr = numtoword(Int(numstr / 10 ^ 12)) numstr = ((numstr / 10 ^ 12) - Int(numstr / 10 ^ 12)) * 10 ^ 12 If numstr = 0 Then tempstr = tempstr & newstr & "billion " Else tempstr = tempstr & newstr & "billion, " End If End IfIf numstr >= 10 ^ 6 Then newstr = numtoword(Int(numstr / 10 ^ 6)) numstr = ((numstr / 10 ^ 6) - Int(numstr / 10 ^ 6)) * 10 ^ 6 If numstr = 0 Then tempstr = tempstr & newstr & "million " Else tempstr = tempstr & newstr & "million, " End If End IfIf numstr >= 10 ^ 3 Then newstr = numtoword(Int(numstr / 10 ^ 3)) numstr = ((numstr / 10 ^ 3) - Int(numstr / 10 ^ 3)) * 10 ^ 3 If numstr = 0 Then tempstr = tempstr & newstr & "thousand " Else tempstr = tempstr & newstr & "thousand, " End If End IfIf numstr >= 10 ^ 2 Then newstr = numtoword(Int(numstr / 10 ^ 2)) numstr = ((numstr / 10 ^ 2) - Int(numstr / 10 ^ 2)) * 10 ^ 2 If numstr = 0 Then tempstr = tempstr & newstr & "hundred " Else tempstr = tempstr & newstr & "hundred and " End If End IfIf numstr >= 20 Then Select Case Int(numstr / 10) Case 2 tempstr = tempstr & "twenty " Case 3 tempstr = tempstr & "thirty " Case 4 tempstr = tempstr & "forty " Case 5 tempstr = tempstr & "fifty " Case 6 tempstr = tempstr & "sixty " Case 7 tempstr = tempstr & "seventy " Case 8 tempstr = tempstr & "eighty " Case 9 tempstr = tempstr & "ninety " End Select numstr = ((numstr / 10) - Int(numstr / 10)) * 10 End IfIf numstr > 0 Then Select Case numstr Case 1 tempstr = tempstr & "one " Case 2 tempstr = tempstr & "two " Case 3 tempstr = tempstr & "three " Case 4 tempstr = tempstr & "four " Case 5 tempstr = tempstr & "five " Case 6 tempstr = tempstr & "six " Case 7 tempstr = tempstr & "seven " Case 8 tempstr = tempstr & "eight " Case 9 tempstr = tempstr & "nine " Case 10 tempstr = tempstr & "ten " Case 11 tempstr = tempstr & "eleven " Case 12 tempstr = tempstr & "twelve " Case 13 tempstr = tempstr & "thirteen " Case 14 tempstr = tempstr & "fourteen " Case 15 tempstr = tempstr & "fifteen " Case 16 tempstr = tempstr & "sixteen " Case 17 tempstr = tempstr & "seventeen " Case 18 tempstr = tempstr & "eighteen " Case 19 tempstr = tempstr & "nineteen " End Select numstr = ((numstr / 10) - Int(numstr / 10)) * 10 End If numtoword = tempstr End Function'在程序中使用实例 Private Sub Command1_Click() Debug.Print numtoword("1234") End Sub
这里有个相似的: Private Sub Command1_Click() MsgBox N2S(123.456) End Sub Function N2S(Num As Double) As String Dim i As Integer, str As String For i = 1 To Len(CStr(Num)) Select Case Mid$(CStr(Num), i, 1) Case "1": str = str + "ONE " Case "2": str = str + "TWO " Case "3": str = str + "THREE " Case "4": str = str + "FOUR " Case "5": str = str + "FIVE " Case "6": str = str + "SIX " Case "7": str = str + "SEVEN " Case "8": str = str + "EIGHT " Case "9": str = str + "NINE " Case "10": str = str + "TEN " Case ".": str = str + "POINT " End Select Next i N2S = str End Function
//真是遗憾,以上的几个都不对啦晕,你不会只是试代码吧?你要做的是要根据大家提供的线索写代码,而不是坐享其成给你修正了一下程序: Option Explicit Public Function numtoword(numstr As Variant) As String Dim s As String Dim arrstr arrstr = Split(numstr, ".") numstr = arrstr(0) If UBound(arrstr) = 1 Then s = arrstr(1) s = Replace(s, "1", " one") s = Replace(s, "2", " two") s = Replace(s, "3", " three") s = Replace(s, "4", " four") s = Replace(s, "5", " five") s = Replace(s, "6", " six") s = Replace(s, "7", " seven") s = Replace(s, "8", " eight") s = Replace(s, "9", " nine") s = Replace(s, "0", " zero") s = " point " + s ElseIf UBound(arrstr) > 1 Then numtoword = "" MsgBox "小数点多于一个" Exit Function ElseIf UBound(arrstr) = 0 Then s = "" End If '---------------------------------------------------- ' The best data type to feed in is ' Decimal, but it is up to you '---------------------------------------------------- Dim tempstr As String Dim newstr As String numstr = CDec(numstr)
If numstr = 0 Then numtoword = "zero " Exit Function End If
If numstr > 10 ^ 24 Then numtoword = "Too big" Exit Function End If
If numstr >= 10 ^ 12 Then newstr = numtoword(Int(numstr / 10 ^ 12)) numstr = ((numstr / 10 ^ 12) - Int(numstr / 10 ^ 12)) * 10 ^ 12 If numstr = 0 Then tempstr = tempstr & newstr & "billion " Else tempstr = tempstr & newstr & "billion, " End If End If
If numstr >= 10 ^ 6 Then newstr = numtoword(Int(numstr / 10 ^ 6)) numstr = ((numstr / 10 ^ 6) - Int(numstr / 10 ^ 6)) * 10 ^ 6 If numstr = 0 Then tempstr = tempstr & newstr & "million " Else tempstr = tempstr & newstr & "million, " End If End If
If numstr >= 10 ^ 3 Then newstr = numtoword(Int(numstr / 10 ^ 3)) numstr = ((numstr / 10 ^ 3) - Int(numstr / 10 ^ 3)) * 10 ^ 3 If numstr = 0 Then tempstr = tempstr & newstr & "thousand " Else tempstr = tempstr & newstr & "thousand, " End If End If
If numstr >= 10 ^ 2 Then newstr = numtoword(Int(numstr / 10 ^ 2)) numstr = ((numstr / 10 ^ 2) - Int(numstr / 10 ^ 2)) * 10 ^ 2 If numstr = 0 Then tempstr = tempstr & newstr & "hundred " Else tempstr = tempstr & newstr & "hundred and " End If End If
If numstr >= 20 Then Select Case Int(numstr / 10) Case 2 tempstr = tempstr & "twenty " Case 3 tempstr = tempstr & "thirty " Case 4 tempstr = tempstr & "forty " Case 5 tempstr = tempstr & "fifty " Case 6 tempstr = tempstr & "sixty " Case 7 tempstr = tempstr & "seventy " Case 8 tempstr = tempstr & "eighty " Case 9 tempstr = tempstr & "ninety " End Select numstr = ((numstr / 10) - Int(numstr / 10)) * 10 End If
If numstr > 0 Then Select Case numstr Case 1 tempstr = tempstr & "one " Case 2 tempstr = tempstr & "two " Case 3 tempstr = tempstr & "three " Case 4 tempstr = tempstr & "four " Case 5 tempstr = tempstr & "five " Case 6 tempstr = tempstr & "six " Case 7 tempstr = tempstr & "seven " Case 8 tempstr = tempstr & "eight " Case 9 tempstr = tempstr & "nine " Case 10 tempstr = tempstr & "ten " Case 11 tempstr = tempstr & "eleven " Case 12 tempstr = tempstr & "twelve " Case 13 tempstr = tempstr & "thirteen " Case 14 tempstr = tempstr & "fourteen " Case 15 tempstr = tempstr & "fifteen " Case 16 tempstr = tempstr & "sixteen " Case 17 tempstr = tempstr & "seventeen " Case 18 tempstr = tempstr & "eighteen " Case 19 tempstr = tempstr & "nineteen " End Select numstr = ((numstr / 10) - Int(numstr / 10)) * 10 End If numtoword = tempstr + s End Function'在程序中使用实例 Private Sub Command1_Click() Debug.Print numtoword("1234.8") End Sub
Function numtotext(ByVal numstr As String) As StringDim ones, teens, tens, thousands Dim i As Long, p As Long, nCol As Long, kilo As Boolean Dim buff As String, temp As String, nChar As String, N As String ones = Array(" zero ", " one ", " two ", " three ", " four ", " five ", " six ", " seven ", " eight ", " nine ") teens = Array(" ten ", " eleven ", " twelve ", " thirteen ", " fourteen ", " fifteen ", " sixteen ", " seventeen ", " eighteen ", " nineteen ") tens = Array("", " ten ", " twenty ", " thirty ", " forty ", " fifty ", " sixty ", " seventy ", " eighty ", " ninety ") thousands = Array("", " thousand ", " million ", " billion ", " trillion ") buff = ""
If numstr = "" Then MsgBox "数字为空!!!" & vbCrLf & vbCrLf & "No Number Exists!!!", 64, "警告": Exit Function If IsNumeric(numstr) = False Then MsgBox "非数字!!!" & vbCrLf & vbCrLf & "Not a Number!!!", 64, "警告": Exit Function p = IIf(InStr(1, numstr, ".") > 0, InStr(1, numstr, "."), Len(numstr)) If p >= 16 Then MsgBox "转换的数字不得大于一千万亿!!!" & vbCrLf & vbCrLf & "The Number To Be Converted Must Less Than One Thousand Trillion!!!", 64, "警告": Exit Function N = Left(numstr, p - 1)
For i = p + 1 To Len(numstr) buff = buff & ones((Mid(numstr, i, 1)))
Next buff = IIf(buff = "", "", " point " & buff) For i = Len(N) To 1 Step -1 'Get value of this digit nChar = Mid(N, i, 1) 'Get column position nCol = (Len(N) - i) + 1 'Action depends on 1's, 10's or 100's column Select Case (nCol Mod 3) Case 1 '1's position kilo = True If i = 1 Then temp = ones(nChar) 'First digit in number (last in loop)
ElseIf Mid(N, i - 1, 1) = "1" Then temp = teens(nChar): 'This digit is part of "teen" number i = i - 1 'Skip tens position
ElseIf nChar > 0 Then temp = ones(nChar) 'Any non-zero digit Else kilo = False 'Test for non-zero digit in this grouping If Mid(N, i - 1, 1) <> "0" Then kilo = True ElseIf i > 2 Then If Mid$(N, i - 2, 1) <> "0" Then kilo = True temp = "" End If End If 'Show "thousands" if non-zero in grouping If kilo Then buff = temp & IIf(nCol > 1, thousands(nCol \ 3), "") & buff Case 2 '10's position If nChar > 0 Then buff = IIf(Mid$(N, i + 1, 1) <> "0", tens(nChar) & buff, tens(nChar) & buff)
Case 0 '100's position buff = Switch(nChar > 0, ones(nChar) & " hundred and ", nChar = 0 And nCol <> Len(N), " and ") & buff End Select Next i Do While InStr(1, buff, " and and ") > 0 buff = Replace(buff, " and and ", " and ") Loop For i = 1 To 4 buff = Replace(buff, " and " & thousands(i), thousands(i)) Next buff = Replace(buff, " and point ", " point ") buff = Replace(buff, " ", " ") buff = IIf(Right(buff, 4) = "and ", Left(buff, Len(buff) - 4), buff) buff = UCase(Left(buff, 2)) & Mid(buff, 3, Len(buff) - 2) 'Convert first letter to upper case
numtotext = buff 'Return result
End FunctionPrivate Sub Command1_Click() MsgBox numtotext(447653470054.345) End Sub
下面是转化为汉字
请把 零:ZERO 壹:ONE 等做响应改动即可' 本模块生成汉字大写的金额
' 名称: CCh
' 得到一位数字 N1 的汉字大写
' 0 返回 ""
Private Function CCh(N1) As String
Select Case N1
Case 0
CCh = "零"
Case 1
CCh = "壹"
Case 2
CCh = "贰"
Case 3
CCh = "叁"
Case 4
CCh = "肆"
Case 5
CCh = "伍"
Case 6
CCh = "陆"
Case 7
CCh = "柒"
Case 8
CCh = "捌"
Case 9
CCh = "玖"
End Select
End Function
'名称: ChMoney
' 得到数字 N1 的汉字大写
' 最大为 千万位
' O 返回 ""
Public Function ChMoney(N1) As String
Dim tMoney As String
Dim lMoney As String
Dim tn '小数位置
Dim s1 As String '临时STRING 小数部分
Dim s2 As String '1000 以内
Dim s3 As String '10000If N1 = 0 Then
ChMoney = " "
Exit Function
End If
If N1 < 0 Then
ChMoney = "负" + ChMoney(Abs(N1))
Exit Function
End If
tMoney = Trim(Str(N1))
tn = InStr(tMoney, ".") '小数位置
s1 = ""If tn <> 0 Then
ST1 = Right(tMoney, Len(tMoney) - tn)
If ST1 <> "" Then
t1 = Left(ST1, 1)
ST1 = Right(ST1, Len(ST1) - 1)
If t1 <> "0" Then
s1 = s1 + CCh(Val(t1)) + "角"
End If
If ST1 <> "" Then
t1 = Left(ST1, 1)
s1 = s1 + CCh(Val(t1)) + "分"
End If
End If
ST1 = Left(tMoney, tn - 1)
Else
ST1 = tMoney
End If
s2 = ""
If ST1 <> "" Then
t1 = Right(ST1, 1)
ST1 = Left(ST1, Len(ST1) - 1)
s2 = CCh(Val(t1)) + s2
End IfIf ST1 <> "" Then
t1 = Right(ST1, 1)
ST1 = Left(ST1, Len(ST1) - 1)
If t1 <> "0" Then
s2 = CCh(Val(t1)) + "拾" + s2
Else
If Left(s2, 1) <> "零" Then s2 = "零" + s2
End If
End IfIf ST1 <> "" Then
t1 = Right(ST1, 1)
ST1 = Left(ST1, Len(ST1) - 1)
If t1 <> "0" Then
s2 = CCh(Val(t1)) + "佰" + s2
Else
If Left(s2, 1) <> "零" Then s2 = "零" + s2
End If
End IfIf ST1 <> "" Then
t1 = Right(ST1, 1)
ST1 = Left(ST1, Len(ST1) - 1)
If t1 <> "0" Then
s2 = CCh(Val(t1)) + "仟" + s2
Else
If Left(s2, 1) <> "零" Then s2 = "零" + s2
End If
End Ifs3 = ""
If ST1 <> "" Then
t1 = Right(ST1, 1)
ST1 = Left(ST1, Len(ST1) - 1)
s3 = CCh(Val(t1)) + s3
End If
If ST1 <> "" Then
t1 = Right(ST1, 1)
ST1 = Left(ST1, Len(ST1) - 1)
If t1 <> "0" Then
s3 = CCh(Val(t1)) + "拾" + s3
Else
If Left(s3, 1) <> "零" Then s3 = "零" + s3
End If
End IfIf ST1 <> "" Then
t1 = Right(ST1, 1)
ST1 = Left(ST1, Len(ST1) - 1)
If t1 <> "0" Then
s3 = CCh(Val(t1)) + "佰" + s3
Else
If Left(s3, 1) <> "零" Then s3 = "零" + s3
End If
End IfIf ST1 <> "" Then
t1 = Right(ST1, 1)
ST1 = Left(ST1, Len(ST1) - 1)
If t1 <> "0" Then
s3 = CCh(Val(t1)) + "仟" + s3
End If
End If
If Right(s2, 1) = "零" Then s2 = Left(s2, Len(s2) - 1)
If Len(s3) > 0 Then
If Right(s3, 1) = "零" Then s3 = Left(s3, Len(s3) - 1)
s3 = s3 & "万"
End IfChMoney = IIf(s3 & s2 = "", s1, s3 & s2 & "元" & s1)End Function
只好自己编一个了。
Public Function numtoword(numstr As Variant) As String
'----------------------------------------------------
' The best data type to feed in is
' Decimal, but it is up to you
'----------------------------------------------------
Dim tempstr As String
Dim newstr As String
numstr = CDec(numstr)If numstr = 0 Then
numtoword = "zero "
Exit Function
End IfIf numstr > 10 ^ 24 Then
numtoword = "Too big"
Exit Function
End IfIf numstr >= 10 ^ 12 Then
newstr = numtoword(Int(numstr / 10 ^ 12))
numstr = ((numstr / 10 ^ 12) - Int(numstr / 10 ^ 12)) * 10 ^ 12
If numstr = 0 Then
tempstr = tempstr & newstr & "billion "
Else
tempstr = tempstr & newstr & "billion, "
End If
End IfIf numstr >= 10 ^ 6 Then
newstr = numtoword(Int(numstr / 10 ^ 6))
numstr = ((numstr / 10 ^ 6) - Int(numstr / 10 ^ 6)) * 10 ^ 6
If numstr = 0 Then
tempstr = tempstr & newstr & "million "
Else
tempstr = tempstr & newstr & "million, "
End If
End IfIf numstr >= 10 ^ 3 Then
newstr = numtoword(Int(numstr / 10 ^ 3))
numstr = ((numstr / 10 ^ 3) - Int(numstr / 10 ^ 3)) * 10 ^ 3
If numstr = 0 Then
tempstr = tempstr & newstr & "thousand "
Else
tempstr = tempstr & newstr & "thousand, "
End If
End IfIf numstr >= 10 ^ 2 Then
newstr = numtoword(Int(numstr / 10 ^ 2))
numstr = ((numstr / 10 ^ 2) - Int(numstr / 10 ^ 2)) * 10 ^ 2
If numstr = 0 Then
tempstr = tempstr & newstr & "hundred "
Else
tempstr = tempstr & newstr & "hundred and "
End If
End IfIf numstr >= 20 Then
Select Case Int(numstr / 10)
Case 2
tempstr = tempstr & "twenty "
Case 3
tempstr = tempstr & "thirty "
Case 4
tempstr = tempstr & "forty "
Case 5
tempstr = tempstr & "fifty "
Case 6
tempstr = tempstr & "sixty "
Case 7
tempstr = tempstr & "seventy "
Case 8
tempstr = tempstr & "eighty "
Case 9
tempstr = tempstr & "ninety "
End Select
numstr = ((numstr / 10) - Int(numstr / 10)) * 10
End IfIf numstr > 0 Then
Select Case numstr
Case 1
tempstr = tempstr & "one "
Case 2
tempstr = tempstr & "two "
Case 3
tempstr = tempstr & "three "
Case 4
tempstr = tempstr & "four "
Case 5
tempstr = tempstr & "five "
Case 6
tempstr = tempstr & "six "
Case 7
tempstr = tempstr & "seven "
Case 8
tempstr = tempstr & "eight "
Case 9
tempstr = tempstr & "nine "
Case 10
tempstr = tempstr & "ten "
Case 11
tempstr = tempstr & "eleven "
Case 12
tempstr = tempstr & "twelve "
Case 13
tempstr = tempstr & "thirteen "
Case 14
tempstr = tempstr & "fourteen "
Case 15
tempstr = tempstr & "fifteen "
Case 16
tempstr = tempstr & "sixteen "
Case 17
tempstr = tempstr & "seventeen "
Case 18
tempstr = tempstr & "eighteen "
Case 19
tempstr = tempstr & "nineteen "
End Select
numstr = ((numstr / 10) - Int(numstr / 10)) * 10
End If
numtoword = tempstr
End Function'在程序中使用实例
Private Sub Command1_Click()
Debug.Print numtoword("1234")
End Sub
Private Sub Command1_Click()
MsgBox N2S(123.456)
End Sub
Function N2S(Num As Double) As String
Dim i As Integer, str As String
For i = 1 To Len(CStr(Num))
Select Case Mid$(CStr(Num), i, 1)
Case "1": str = str + "ONE "
Case "2": str = str + "TWO "
Case "3": str = str + "THREE "
Case "4": str = str + "FOUR "
Case "5": str = str + "FIVE "
Case "6": str = str + "SIX "
Case "7": str = str + "SEVEN "
Case "8": str = str + "EIGHT "
Case "9": str = str + "NINE "
Case "10": str = str + "TEN "
Case ".": str = str + "POINT "
End Select
Next i
N2S = str
End Function
Option Explicit
Public Function numtoword(numstr As Variant) As String
Dim s As String
Dim arrstr
arrstr = Split(numstr, ".")
numstr = arrstr(0)
If UBound(arrstr) = 1 Then
s = arrstr(1)
s = Replace(s, "1", " one")
s = Replace(s, "2", " two")
s = Replace(s, "3", " three")
s = Replace(s, "4", " four")
s = Replace(s, "5", " five")
s = Replace(s, "6", " six")
s = Replace(s, "7", " seven")
s = Replace(s, "8", " eight")
s = Replace(s, "9", " nine")
s = Replace(s, "0", " zero")
s = " point " + s
ElseIf UBound(arrstr) > 1 Then
numtoword = ""
MsgBox "小数点多于一个"
Exit Function
ElseIf UBound(arrstr) = 0 Then
s = ""
End If
'----------------------------------------------------
' The best data type to feed in is
' Decimal, but it is up to you
'----------------------------------------------------
Dim tempstr As String
Dim newstr As String
numstr = CDec(numstr)
If numstr = 0 Then
numtoword = "zero "
Exit Function
End If
If numstr > 10 ^ 24 Then
numtoword = "Too big"
Exit Function
End If
If numstr >= 10 ^ 12 Then
newstr = numtoword(Int(numstr / 10 ^ 12))
numstr = ((numstr / 10 ^ 12) - Int(numstr / 10 ^ 12)) * 10 ^ 12
If numstr = 0 Then
tempstr = tempstr & newstr & "billion "
Else
tempstr = tempstr & newstr & "billion, "
End If
End If
If numstr >= 10 ^ 6 Then
newstr = numtoword(Int(numstr / 10 ^ 6))
numstr = ((numstr / 10 ^ 6) - Int(numstr / 10 ^ 6)) * 10 ^ 6
If numstr = 0 Then
tempstr = tempstr & newstr & "million "
Else
tempstr = tempstr & newstr & "million, "
End If
End If
If numstr >= 10 ^ 3 Then
newstr = numtoword(Int(numstr / 10 ^ 3))
numstr = ((numstr / 10 ^ 3) - Int(numstr / 10 ^ 3)) * 10 ^ 3
If numstr = 0 Then
tempstr = tempstr & newstr & "thousand "
Else
tempstr = tempstr & newstr & "thousand, "
End If
End If
If numstr >= 10 ^ 2 Then
newstr = numtoword(Int(numstr / 10 ^ 2))
numstr = ((numstr / 10 ^ 2) - Int(numstr / 10 ^ 2)) * 10 ^ 2
If numstr = 0 Then
tempstr = tempstr & newstr & "hundred "
Else
tempstr = tempstr & newstr & "hundred and "
End If
End If
If numstr >= 20 Then
Select Case Int(numstr / 10)
Case 2
tempstr = tempstr & "twenty "
Case 3
tempstr = tempstr & "thirty "
Case 4
tempstr = tempstr & "forty "
Case 5
tempstr = tempstr & "fifty "
Case 6
tempstr = tempstr & "sixty "
Case 7
tempstr = tempstr & "seventy "
Case 8
tempstr = tempstr & "eighty "
Case 9
tempstr = tempstr & "ninety "
End Select
numstr = ((numstr / 10) - Int(numstr / 10)) * 10
End If
If numstr > 0 Then
Select Case numstr
Case 1
tempstr = tempstr & "one "
Case 2
tempstr = tempstr & "two "
Case 3
tempstr = tempstr & "three "
Case 4
tempstr = tempstr & "four "
Case 5
tempstr = tempstr & "five "
Case 6
tempstr = tempstr & "six "
Case 7
tempstr = tempstr & "seven "
Case 8
tempstr = tempstr & "eight "
Case 9
tempstr = tempstr & "nine "
Case 10
tempstr = tempstr & "ten "
Case 11
tempstr = tempstr & "eleven "
Case 12
tempstr = tempstr & "twelve "
Case 13
tempstr = tempstr & "thirteen "
Case 14
tempstr = tempstr & "fourteen "
Case 15
tempstr = tempstr & "fifteen "
Case 16
tempstr = tempstr & "sixteen "
Case 17
tempstr = tempstr & "seventeen "
Case 18
tempstr = tempstr & "eighteen "
Case 19
tempstr = tempstr & "nineteen "
End Select
numstr = ((numstr / 10) - Int(numstr / 10)) * 10
End If
numtoword = tempstr + s
End Function'在程序中使用实例
Private Sub Command1_Click()
Debug.Print numtoword("1234.8")
End Sub
我有完全符合要求,我在做一个外贸出口发票时用的.
Dim i As Long, p As Long, nCol As Long, kilo As Boolean
Dim buff As String, temp As String, nChar As String, N As String ones = Array(" zero ", " one ", " two ", " three ", " four ", " five ", " six ", " seven ", " eight ", " nine ")
teens = Array(" ten ", " eleven ", " twelve ", " thirteen ", " fourteen ", " fifteen ", " sixteen ", " seventeen ", " eighteen ", " nineteen ")
tens = Array("", " ten ", " twenty ", " thirty ", " forty ", " fifty ", " sixty ", " seventy ", " eighty ", " ninety ")
thousands = Array("", " thousand ", " million ", " billion ", " trillion ")
buff = ""
If numstr = "" Then MsgBox "数字为空!!!" & vbCrLf & vbCrLf & "No Number Exists!!!", 64, "警告": Exit Function
If IsNumeric(numstr) = False Then MsgBox "非数字!!!" & vbCrLf & vbCrLf & "Not a Number!!!", 64, "警告": Exit Function
p = IIf(InStr(1, numstr, ".") > 0, InStr(1, numstr, "."), Len(numstr))
If p >= 16 Then MsgBox "转换的数字不得大于一千万亿!!!" & vbCrLf & vbCrLf & "The Number To Be Converted Must Less Than One Thousand Trillion!!!", 64, "警告": Exit Function
N = Left(numstr, p - 1)
For i = p + 1 To Len(numstr)
buff = buff & ones((Mid(numstr, i, 1)))
Next
buff = IIf(buff = "", "", " point " & buff)
For i = Len(N) To 1 Step -1 'Get value of this digit
nChar = Mid(N, i, 1) 'Get column position
nCol = (Len(N) - i) + 1 'Action depends on 1's, 10's or 100's column
Select Case (nCol Mod 3) Case 1 '1's position
kilo = True
If i = 1 Then
temp = ones(nChar) 'First digit in number (last in loop)
ElseIf Mid(N, i - 1, 1) = "1" Then
temp = teens(nChar): 'This digit is part of "teen" number
i = i - 1 'Skip tens position
ElseIf nChar > 0 Then
temp = ones(nChar) 'Any non-zero digit
Else
kilo = False
'Test for non-zero digit in this grouping
If Mid(N, i - 1, 1) <> "0" Then
kilo = True
ElseIf i > 2 Then
If Mid$(N, i - 2, 1) <> "0" Then kilo = True
temp = ""
End If
End If
'Show "thousands" if non-zero in grouping
If kilo Then buff = temp & IIf(nCol > 1, thousands(nCol \ 3), "") & buff
Case 2 '10's position
If nChar > 0 Then buff = IIf(Mid$(N, i + 1, 1) <> "0", tens(nChar) & buff, tens(nChar) & buff)
Case 0 '100's position
buff = Switch(nChar > 0, ones(nChar) & " hundred and ", nChar = 0 And nCol <> Len(N), " and ") & buff
End Select
Next i
Do While InStr(1, buff, " and and ") > 0
buff = Replace(buff, " and and ", " and ")
Loop
For i = 1 To 4
buff = Replace(buff, " and " & thousands(i), thousands(i))
Next
buff = Replace(buff, " and point ", " point ")
buff = Replace(buff, " ", " ")
buff = IIf(Right(buff, 4) = "and ", Left(buff, Len(buff) - 4), buff)
buff = UCase(Left(buff, 2)) & Mid(buff, 3, Len(buff) - 2) 'Convert first letter to upper case
numtotext = buff 'Return result
End FunctionPrivate Sub Command1_Click()
MsgBox numtotext(447653470054.345)
End Sub