首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

转换有关问题(怎样把小写的数字转换成大写的数字?)

2012-02-01 
转换问题(怎样把小写的数字转换成大写的数字??)例如:543.78元我想得到的为伍百肆拾三元柒毛八分哦[解决办

转换问题(怎样把小写的数字转换成大写的数字??)
例如:543.78元
我想得到的为伍百肆拾三元柒毛八分哦

[解决办法]
Public Function dfTransToBig(ByVal curMoney As Variant) As String
On Error GoTo ErrTrap
If Not IsNumeric(curMoney) Then
Exit Function
End If
dfTransToBig = " "

Dim strMoney As String
Dim strInt As String
Dim strDec As String
Dim strTemp As String

strMoney = Format(Str(curMoney), "#.00 ")
strInt = Left(strMoney, Len(strMoney) - 3)
strInt = String(12 - Len(strInt), "0 ") & Trim(strInt)
strDec = Right(strMoney, 2)

strTemp = dfGroupToBig(Mid(strInt, 1, 4))
If strTemp <> " " Then
dfTransToBig = dfTransToBig & strTemp & "亿 "
End If

strTemp = dfGroupToBig(Mid(strInt, 5, 4))
If strTemp <> " " Then
dfTransToBig = dfTransToBig & strTemp & "万 "
End If

strTemp = dfGroupToBig(Mid(strInt, 9, 4))
If strTemp <> " " Then
dfTransToBig = dfTransToBig & strTemp
End If

dfTransToBig = dfTransToBig & "圆 "
If strDec = "00 " Then
dfTransToBig = dfTransToBig & "整 "
Else
If Left(strDec, 1) = "0 " Then
dfTransToBig = dfTransToBig & dfNumberToBig(Right(strDec, 1)) & "分 "
Else
If Right(strDec, 1) = "0 " Then
dfTransToBig = dfTransToBig & dfNumberToBig(Left(strDec, 1)) & "角 "
Else
dfTransToBig = dfTransToBig & dfNumberToBig(Left(strDec, 1)) & "角 " & dfNumberToBig(Right(strDec, 1)) & "分 "
End If
End If
End If
Exit Function
ErrTrap:
On Error GoTo 0
End Function
[解决办法]
Private Function dfNumberToBig(ByVal strN As String) As String
Select Case strN
Case "0 "
dfNumberToBig = "零 "
Case "1 "
dfNumberToBig = "壹 "
Case "2 "
dfNumberToBig = "贰 "
Case "3 "
dfNumberToBig = "叁 "
Case "4 "
dfNumberToBig = "肆 "
Case "5 "
dfNumberToBig = "伍 "
Case "6 "
dfNumberToBig = "陆 "
Case "7 "
dfNumberToBig = "柒 "
Case "8 "
dfNumberToBig = "捌 "
Case "9 "
dfNumberToBig = "玖 "
End Select
End Function

[解决办法]
源代码都有了,复制下来用不就行了,这不都是现成的了吗?
[解决办法]
同一种程序有很多写法,上面那个算法写得有点麻烦了。等我给你一个简练点的。
[解决办法]
建立一个模块,将下面的代码拷贝的模块里。
注意:暂时没实现下面两个功能。
1、零百零十零万的缩位。
2、没有超出长度的处理,超过预期数字长度将导致程序崩溃。如果你把它用在商业用途,一定要小心这个现象。

函数叫ChinaNumericGet,参数是一个Double值。你只要“金额=ChinaNumericGet(数字)”就可以了。至于这个程序具体的原理如果详细说起来比较多,大致就是一个查表法。
我写程序不喜欢用Select和If Then,因为太麻烦,不容易扩展。


如果你把conBitNameTable的值改为“头十百千万十百千亿十百千万十百千兆十百千万十百千亿十百千万十百千”;把Format(pValue, "#.00 ")改成Format(pValue, "# ")。则可以用来给养猪场清点大肥猪。
^_^


Const conBitNameTable As String = "分角元十百千万十百千亿十百千万十百千兆十百千万十百千亿十百千万十百千 "
Const conNumericTable As String = "零壹贰叁肆伍陆柒捌玖 "

Public Function ChinaNumericGet(ByVal pValue As Double) As String
Dim tOutStr As String

Dim tValueStr As String
Dim tValueBits() As Byte
Dim tValueBitsLen As Long
Dim tValueBitsIndex As Long

tValueStr = Format(pValue, "#.00 ")
tValueStr = Replace(tValueStr, ". ", " ")
tValueBits() = StrConv(tValueStr, vbFromUnicode)
tValueBitsLen = UBound(tValueBits())

Dim tValueBitsLenCheck As Boolean

tValueBitsLenCheck = tValueBitsLen > (Len(conBitNameTable) - 1)

Dim tBitStr As String
Dim tBitIndex As Long

For tValueBitsIndex = tValueBitsLen To 0 Step -1
tBitStr = Mid(conNumericTable, tValueBits(tValueBitsIndex) - 47, 1)
tBitIndex = tValueBitsLen - tValueBitsIndex + 1
tBitStr = tBitStr & Mid(conBitNameTable, tBitIndex, 1)
tOutStr = tBitStr & tOutStr
Next

ChinaNumericGet = tOutStr
End Function

[解决办法]
下面是程序的实际运行结果。

输入:1233456789.123
输出:壹十贰亿叁千叁百肆十伍万陆千柒百捌十玖元壹角贰分

输入:1000000000.123
输出:壹十零亿零千零百零十零万零千零百零十零元壹角贰分
[解决办法]
楼上的妹妹,程序要给别人用首先确保你的代码是自完备的,否则会导致别人的代码甚至项目崩溃,我的代码7年前写的,虽然不够完美,但至少是安全的代码和没有错误的代码
举个例子:
执行你的代码:Text1.Text = ChinaNumericGet( "abc ")
结果崩溃:实时错误‘13’类型不匹配
执行我的代码:Text1.Text = dfTransToBig( "abc ")
结果:空字符串

其次您的计算结果好象有误啊:
再举个例子
输入:1000050000.123
ChinaNumericGet输出:壹十零亿零千零百零十伍万零千零百零十零元壹角贰分
dfTransToBig输出:壹拾亿伍万圆壹角贰分(这里不需要读出零)
十亿五千万被你转换成“壹十零亿零千零百零十伍万……”
包括你举的1000000000.123的结果,读都读不通

在举个关于读零的例子
输入1005.123
ChinaNumericGet输出:壹千零百零十伍元壹角贰分(还是读不通)
dfTransToBig输出:壹仟零伍圆壹角贰分(这里只读一次零)

顺便说一句,你的“十”应该是“拾”,当然这倒是小问题了
解决这个问题是要求你具备一些基本数学和财务知识的
[解决办法]
关注,小鲜美很长时间没来VB版了啊,呵呵
[解决办法]
写法的确许多。读法要看楼主具体要求了。
[解决办法]
也给贴个示例,如果要向microtry(米醋)那样的读法,可以用replace进一步格式化

Function GetRMB(dMoney As Currency) As String

Dim sMoney As String
Dim sGetRMB As String
Dim sPos As Variant
Dim i As Integer, j As Integer

'格式化
sMoney = Format(dMoney, "##0.00 ")
'用中文替换阿拉伯数字并去掉小数点
sMoney = Replace(sMoney, "0 ", "零 ")
sMoney = Replace(sMoney, "1 ", "壹 ")
sMoney = Replace(sMoney, "2 ", "贰 ")
sMoney = Replace(sMoney, "3 ", "叁 ")
sMoney = Replace(sMoney, "4 ", "肆 ")
sMoney = Replace(sMoney, "5 ", "伍 ")
sMoney = Replace(sMoney, "6 ", "陆 ")
sMoney = Replace(sMoney, "7 ", "柒 ")
sMoney = Replace(sMoney, "8 ", "捌 ")
sMoney = Replace(sMoney, "9 ", "玖 ")
sMoney = Replace(sMoney, ". ", vbNullString)

'从字符串的最后一位开始向前插入相应的单位
sGetRMB = "整 "


sPos = Array( "分 ", "角 ", "元 ", "拾 ", "佰 ", "仟 ", "万 ", "拾 ", "佰 ", "仟 ", "亿 ", "拾 ", "佰 ", "仟 ", "万 ", "兆 ")

For i = Len(sMoney) To 1 Step -1
sGetRMB = Mid(sMoney, i, 1) & sPos(j) & sGetRMB
j = j + 1
Next

If dMoney < 0 Then sGetRMB = "负 " & sGetRMB
GetRMB = sGetRMB

End Function
[解决办法]
我的代码只是阐述一种算法,而不是给他用的。既然这样说的话,我就给一个完整的代码好了。

热点排行