返回列表 發帖

請教一教,多位數

怎樣寫?
491 423,12 100 300,請給中國數字
六千二百三十萬零四千三百二十一,四億三千萬零五千一百,請給阿拉伯數字

首先要了解中文數字的規則,參考Wiki的中文數字

我簡單用一張圖來解釋如何:數字-中文數字

<imgstyle="width:420px;">檢視圖片

1.將小寫依照間隔分開
像數字通常間隔3就有一個逗號123,123,456
中文數字則是間隔4就有一個萬,億,兆,...

可以得到大的間隔萬,億,兆
小的間隔千,百,十

2.從左至右,小間隔中,檢視每位元,非零則
a.如果之前有一個或多個零,先加上零
b.增加ㄧ~九數字
c.si=1,2,3則增加千,百,十

3.從左至右,當遇到大間隔,si=0,但bi!=0
a.增加萬,億,兆字元

-----
反之如果是中文數字-數字,例如
一億零一百二十三萬

1.從左至右,如果是ㄧ~九,紀錄數值到val

2.如果是小間隔字元(千,百,十),依序儲存val到siNum[]長度為4陣列
一百二十三則儲存為siNum[1]=2,siNum[2]=1,siNum[3]=0

3.如果是大間隔字元(萬,億,兆,...),
a.如果上次輸出的10的lastBiPower次方和這次10的biPower次方差了4以上,輸出lastBiPower-4-biPower個0
b.如果val尚未處理,儲存到siNum[0]
c.依序將siNum從index3~0數值輸出

-----
其他注意事項:
1.可以看得出來,以上中文數字-數字規則其實完全不理會零
而是由小間隔(千,百,十)或大間隔字元(兆,億,萬,...)來知道10的x次方
算是一個簡單的parser,不管文法錯誤

2.數字-中文數字規則中,只要有連續一個以上的零,按照Wiki的講法,應該要加上零,所以如圖的範例5920001245應該要念成五十九億二千萬零ㄧ千二百四十五,但是一般上我們會不念兩千萬的零,只要將程式碼
中lastZero=false;反注解即可得到結果不加零

3.哦對了,如果數字開頭是1,程式碼中不會解讀成ㄧ十,而是以十開頭,但是如果1夾在中間,則是念ㄧ十
像100000會輸出十萬,8100000會輸出八百一十萬

4.程式碼中num2spell()函式只接受標準非負整數,010或是1,234格式不接受

-----
C++程式碼(數字-中文數字&amp;中文數字-數字):
http://pastebin.com/ZDKQ0Q2k

(因為上次貼程式碼回答被系統移除怕到了,我這次改用外部連結)

程式碼驗證用到的num.txt:
http://pastebin.com/SLL7fgJk

程式碼驗證用到的spell.txt:
http://pastebin.com/XtpwbEnD

將validate(...)反注解即可驗證正確性
將FILE_IN,FILE_OUT和validate丟的參數改一下,即可反轉驗證方式

TOP

返回列表