主頁 > 軟體工程 > 文本中所有漢字數字轉阿拉伯數字

文本中所有漢字數字轉阿拉伯數字

2020-09-29 19:54:33 軟體工程

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熱心網友回復:

參考 樓主 u012140181 的回復:
結果:
10

500拾
金額:1003050008元6角,120000萬人口
6138元5角1分
10036
天天500000000元
我要10元


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熱心網友回復:

參考 2 樓 zdingyun 的回復:
.............
略改下LZ的Form_Load代碼,輸出到表單,結果與LZ的結果大相徑庭。

不用改,直接貼上樓主的代碼運行,都不是他所說的結果。
面是跟你輸出到表單的一樣。

uj5u.com熱心網友回復:

參考 1 樓 caozhy 的回復:
萬一我用三萬一買了一萬個萬家樂的電器,我就送給千家萬戶。

你給轉換下

結果是:
我用20000買了個家樂的電器,我就送給佰家戶。

uj5u.com熱心網友回復:

參考 6 樓 Chen8013 的回復:
Quote: 參考 1 樓 caozhy 的回復:

萬一我用三萬一買了一萬個萬家樂的電器,我就送給千家萬戶。

你給轉換下

結果是:
我用20000買了個家樂的電器,我就送給佰家戶。


很簡單的道理,不用運行我就知道準不對。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熱心網友回復:

參考 10 樓 lm_whales 的回復:
阿拉伯數字--->漢字數字相對容易
漢字數字--->阿拉伯數字有點難度,關鍵要看場合,表示方式等等
…………

這點說得不錯。
并且,我覺得想把“任意場合”的漢字數字轉換成阿拉伯數字,難度相當大,也沒有什么意思。
在一些特定場合中,“漢字數字”的表達相對規范些(比如用在財務方面的),轉換起來稍微容易點。

就從我在 4F 、6F 給出的結果來看,樓主的這段代碼,基本上沒價值了。

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/139676.html

標籤:VB基礎類

上一篇:VB6.0中,我用picture控制元件想要顯示多個動態曲線不能正常運行怎么弄??求解答!!!

下一篇:求助一個DrawText的問題(在游戲中Print總被重繪)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more