Option Explicit
Function CNum(ByVal CdataStr As String) As String
Dim i As Integer, Idx As Integer, Idc As Integer
Dim tmp As String, sTmp As String, cTmp As String, aTmp As String
Dim Char, CharUnit, Num
Dim rmbFormat As String
Dim NumLong As Long
Dim NumTmp As Long, NumTmpA As Long, NumTmpB As Long
On Error GoTo errexit
'別字串列
Char = Array( "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "百", "千")
'標準字串列
CharUnit = Array("零", "壹", "貳", "叁", "肆", "伍", "陸", "柒", "捌", "玖", "拾", "佰", "仟", "萬", "億")
'中文數位串列
Num = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
rmbFormat = "拾佰仟萬拾佰仟億"
'統一大寫標準
For i = 0 To UBound(Char)
CdataStr = Replace(CdataStr, Char(i), CharUnit(i))
Next
'數字轉換為阿拉伯數字
For i = 0 To UBound(Num)
CdataStr = Replace(CdataStr, CharUnit(i), Num(i))
Next
For i = 1 To Len(CdataStr)
tmp = Mid(CdataStr, i, 1)
If IsNumeric(tmp) Then '數字處理
NumTmp = Val(tmp)
If NumTmp = 0 Then '遇0位數處理
Idx = Idx - 1
End If
If i = Len(CdataStr) Then ' 數字結束處理
NumLong = NumLong + NumTmpB + NumTmp
cTmp = CStr(NumLong)
NumLong = 0
NumTmpB = 0
NumTmp = 0
End If
Else '漢字處理
Idx = InStr(rmbFormat, tmp) '位數讀取
If Idx > 0 Then '大寫漢字處理
If Idx <= 3 Then '千位數處理
If NumTmp > 0 Then '拾 佰 千 非空字頭
NumTmpB = NumTmpB + NumTmp * 10 ^ Idx
NumTmp = 0
Idx = Idx - 1
Else
If NumTmpB > 0 Then '拾 百 千 空字頭 前有數字前綴 顯示漢字 如:6百千=600千
cTmp = CStr(NumTmpB) & tmp
Else
If Idx = 1 Then '無數字前綴 拾 空字頭 只限:拾=10
NumTmp = 1
NumTmpB = NumTmp * 10 ^ Idx
NumTmp = 0
Idx = Idx - 1
Else '無數字前綴空字 如:“百”=“百”
cTmp = tmp
End If
End If
End If
ElseIf Idx = 0 Or Idx = 4 Or Idx = 8 Then ' 萬 億 位數分段計算,保留空位數(IDX=0)計算
If NumTmp > 0 Or NumTmpB > 0 Then '只計算第一次出現,下一次作為后綴(如:10萬萬只計算第一個“萬”,第二個“萬”作為后綴處理)
NumLong = NumLong + (NumTmpB + NumTmp) * 10 ^ Idx '保留此位資料,壘入之后的數字
NumTmpB = 0
NumTmp = 0
ElseIf NumLong > 0 Then '漢字后綴表示處理,如:10萬萬只計算第一個“萬”,第二個“萬”作為后綴處理
cTmp = CStr(NumLong) & tmp
NumLong = 0
End If
Idc = Idx - 1
ElseIf NumLong = 0 And NumTmp = 0 And NumTmpB > 0 Then '百 拾 后綴處理
cTmp = CStr(NumTmpB) & tmp
NumTmpB = 0
Else
cTmp = tmp '大于“億”漢字數字及 非大寫數字——字符處理 直接顯示 如:100兆=100兆
Idc = 0
End If
Else '其它漢字或字符處理
If NumLong > 0 Or NumTmp > 0 Or NumTmpB > 0 Then '計算漢字部分數值 合并
NumLong = NumLong + (NumTmpB + NumTmp) * 10 ^ Idx
cTmp = CStr(NumLong)
NumLong = 0
NumTmp = 0
NumTmpB = 0
End If
cTmp = cTmp & tmp
End If
If i = Len(CdataStr) And cTmp = "" Then '結束轉換處理 如:10千=100000 10萬=1000000 結束內部計算 結束計算輸出計算結果
If NumLong > 0 Or NumTmpB > 0 Or NumTmp > 0 Then
NumLong = NumLong + (NumTmpB + NumTmp) * 10 ^ Idx
cTmp = CStr(NumLong)
NumTmp = 0
NumLong = 0
NumTmpB = 0
Else '無內部數字計算結果處理
cTmp = tmp
End If
End If
End If
If cTmp <> "" Then '轉換資料、漢字、字串接
sTmp = sTmp & cTmp
cTmp = ""
End If
Next i
'轉換成功,輸出資料
CNum = sTmp
Exit Function
'轉換失敗,輸出空
errexit:
CNum = ""
End Function
Private Sub Form_Load()
Debug.Print CNum("拾")
Debug.Print CNum("百")
Debug.Print CNum("五佰十")
Debug.Print CNum("金額:拾億零叁百05萬零捌元六角,拾2萬萬人口")
Debug.Print CNum("陸仟壹佰叁拾捌元五角一分")
Debug.Print CNum("一萬零叁拾陸")
Debug.Print CNum("天天五億元")
Debug.Print CNum("我要拾元")
End Sub
結果:
10
佰
500拾
金額:1003050008元6角,120000萬人口
6138元5角1分
10036
天天500000000元
我要10元
uj5u.com熱心網友回復:
萬一我用三萬一買了一萬個萬家樂的電器,我就送給千家萬戶。你給轉換下
uj5u.com熱心網友回復:
Private Sub Form_Load()
Me.Show
Me.Print CNum("拾")
Me.Print CNum("百")
Me.Print CNum("五佰十")
Me.Print CNum("金額:拾億零叁百05萬零捌元六角,拾2萬萬人口")
Me.Print CNum("陸仟壹佰叁拾捌元五角一分")
Me.Print CNum("一萬零叁拾陸")
Me.Print CNum("天天五億元")
Me.Print CNum("我要拾元")
End Sub
略改下LZ的Form_Load代碼,輸出到表單,結果與LZ的結果大相徑庭。
uj5u.com熱心網友回復:
不要說語意分析和分詞,連基本的狀態機都不用就能決議文本的程式,根本都不用看。uj5u.com熱心網友回復:

樓主,你的“結果”是你“想象的結果”吧!
難道你沒看一下運行結果?
(我覺得一般都會運行來看的吧!
)很搞笑的是:
CNum("百") = 10
CNum("五佰十") = 409
uj5u.com熱心網友回復:
不用改,直接貼上樓主的代碼運行,都不是他所說的結果。
面是跟你輸出到表單的一樣。
uj5u.com熱心網友回復:
結果是:
我用20000買了個家樂的電器,我就送給佰家戶。
uj5u.com熱心網友回復:
很簡單的道理,不用運行我就知道準不對。IT民科總喜歡用土辦法挑戰計算機科學的一些基本方法論,但是一次一次碰壁卻執迷不悟。
我估計lz不會去看NLP或者編譯原理之類的書籍,而會說,哦,果然不行嘛,那我再改改……
uj5u.com熱心網友回復:
一百零五,一萬零五漢語數字不是簡單組合的。
其它語言也沒有這么簡單
另外漢語大數表示有三種
1)十進制表示發法
1億=10萬 。。。這個現在已經不用了
1兆=100萬 。。。這個常用
2)萬進制表示法
萬萬為億。。。這個常用
萬億為兆。。。這個現在已經不常用了
3)萬的冪表示法
萬萬為億
億億為兆
4)現在標準的表示方法是
2)
不過,1兆=100萬 。。。這個也經常用。
個十百千萬億,這是常用的
萬,億,兆,京,垓 這個很少看到,只有大數才用
另外 漢語現在數的表示 是萬進制,和十進制聯合用法
萬以內 10進制 萬以上萬進制
比如十億一千三百萬四千八百,每四位一組,形成萬進制的一個位,這個萬進制位,內部是十進制的。
這個是比較復雜的。
uj5u.com熱心網友回復:
自然語言理解?uj5u.com熱心網友回復:
阿拉伯數字--->漢字數字相對容易漢字數字--->阿拉伯數字有點難度,關鍵要看場合,表示方式等等
比如“中國人口統計數字大約有13億,估計有16億”
1)純漢語數字
可以這么說“中國人口統計數字大約有十三億,估計有十六億”
也可以這么說“中國人口統計數字大約有十三萬萬,估計有十六萬萬”
可以這么說“中國人口統計數字大約有一十三億,估計有一十六億”
也可以這么說“中國人口統計數字大約有一十三萬萬,估計有一十六萬萬”
2)阿拉伯數字,漢字混用
可以這么說“中國人口統計數字大約有13億,估計有16億”
也可以這么說“中國人口統計數字大約有13萬萬,估計有16萬萬”
是相當復雜的
還有0====> 零,〇,另,單
108 ==> 一百零八,一百〇八,一百單八,一〇八,一百另八
1080 ===>一千零八十
1008 ===>一千零八
280 ===>二百八,兩百八,二百八十,兩百八十
uj5u.com熱心網友回復:
再舉一例對話“老人家高壽?”
“癡長八十有五矣。”
你要從這些模式中總結出規律,才能寫出程式。
而有些方式,可以不必考慮。
uj5u.com熱心網友回復:
阿拉伯數字--->漢字數字相對容易
漢字數字--->阿拉伯數字有點難度,關鍵要看場合,表示方式等等
…………
這點說得不錯。
并且,我覺得想把“任意場合”的漢字數字轉換成阿拉伯數字,難度相當大,也沒有什么意思。
在一些特定場合中,“漢字數字”的表達相對規范些(比如用在財務方面的),轉換起來稍微容易點。
就從我在 4F 、6F 給出的結果來看,樓主的這段代碼,基本上沒價值了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/139676.html
標籤:VB基礎類
