Pattarn:
為第(%1)段
Commands:
chnumbers="零 一 二 三 四 五 六 七 八 九"
#var bloodmap %1
#loop 0,9 {#var bloodmap %replace(@bloodmap,%word(@chnumbers,%eval(%i+1)),|%i|)}
#delitem bloodmap ""
#case (%ismember(%ismember(十,@bloodmap),0|1)) {#var total 0} {#var total 10}
{#var total %eval(%item(@bloodmap,%ismember(十,@bloodmap)-1)*10)}
#if (%ismember(百,@bloodmap)>0) {#var total
%eval(%item(@bloodmap,1)*100+@total)}
#if (%item(@bloodmap,%numitems(@bloodmap))<10) {#var total
%eval(%item(@bloodmap,%numitems(@bloodmap))+@total)}
#say @total
說明:
01行:建立一個字串chnumbers,裡面包含中文字一到九。
03行:將段數存入bloodmap,由於血肉長城的段數不完全符合書寫標準,所以段數有
以下情況:
一
十 << 標準格式為一十。
十七 << 標準格式為一十一。
八十二
三百
三百零九
三百四十
四百五十六
04行:用loop將chnumbers裡的中文字改成數字0~9,chnumbers沒有第0項,所以要加
1。上列段數經置換後結果如下:
原 格 式 置 換 後 結 果
一 |1|
十 十
十七 十|7|
八十二 |8|十|2|
三百 |3|百
三百零九 |3|百|0||9|
三百四十 |3|百|4|十
四百五十六 |4|百|5|十|6|
05行:現在bloodmap的內容是標準String list格式,為了讓內容更好判斷,必須將
空白欄位刪除,使用#delitem處理後如下:
原 格 式 置 換 後 結 果 delitem處理結果
一 |1| 1
十 十 十
十七 十|7| 十|7
八十二 |8|十|2| 8|十|2
三百 |3|百 3|百
三百零九 |3|百|0||9| 3|百|0|9
三百四十 |3|百|4|十 3|百|4|十
四百五十六 |4|百|5|十|6| 4|百|5|十|6
06行:本行在處理十位數的計算,將十位數計算置於首位可以順便將舊有的total值
重新寫入,十位數的計算有以下情況:
delitem處理結果 資料筆數 "十"的位置 判斷結果 選擇項 結果
01 1 1 none(0) 1 1 0
02 十 1 1 2 2 10
03 十|7 2 1 2 2 10
04 8|十|2 3 2 none(0) 3 80
05 3|百 2 none(0) 1 1 0
06 3|百|0|9 4 none(0) 1 1 0
07 3|百|4|十 4 4 none(0) 3 40
08 4|百|5|十|6 5 4 none(0) 3 50
#case 判斷式結構如下:
算出"十"在bloodmap的位置(上表黃色欄位)
(%ismember(%ismember(十,@bloodmap),0|1))
算出黃色式子的值在藍色列表的位置╝(上表綠色欄位)
選擇項代表三個情況:1.十不存在。2.十前方無數字。3.十前方有數字。
1與2內容很簡單無須說明,而3結構如下:
算出"十"前一筆資料在bloodmap的位置
%eval(%item(@bloodmap,%ismember(十,@bloodmap)-1)*10)
取出bloodmap中,"十"前一筆資料 將該筆資料X10
07行:本行執行百位數的計算,比起十位數相對容易得多,僅有兩種情況:
delitem處理結果 "百"的位置 判斷結果 選擇項 結果 加 總
01 1 none(0) 0 2 不執行
02 十 none(0) 0 2 不執行
03 十|7 none(0) 0 2 不執行
04 8|十|2 none(0) 0 2 不執行
05 3|百 2 1 1 300 300
06 3|百|0|9 2 1 1 300 300
07 3|百|4|十 2 1 1 300 340
08 4|百|5|十|6 2 1 1 400 450
#if 判斷式如下,找出百在bloodmap第幾個欄位,大於0,就選擇執行項目1,
小於0,因為沒設定項目,所以結束:
(%ismember(百,@bloodmap)>0)
選擇項1結構如下:
取出bloodmap第一欄資料
%eval(%item(@bloodmap,1)*100+@total)
將黃色式子的結果X100再加上total的值
如果要計算到千位,上方選擇項就要用十位數計算式選項3的寫法。
08行:本行執行個位數的計算,基本上就是判斷末筆資料是否小於10:
delitem處理結果 資料筆數 末筆資料 判斷結果 選擇項 結果 加 總
01 1 1 1 1 1 1 1
02 十 1 1 none(0) 0 不執行 不執行
03 十|7 2 2 1 1 7 17
04 8|十|2 3 3 1 1 2 82
05 3|百 2 2 none(0) 0 不執行 不執行
06 3|百|0|9 4 4 1 1 9 309
07 3|百|4|十 4 4 none(0) 0 不執行 不執行
08 4|百|5|十|6 5 5 1 1 6 456
到這裡,計算已經完成了!
09行:觀看執行結果....
結語:如果要計算到千位和萬位,做法都相似,多兩道判斷罷了!
而十萬位以上甚至千億位,做法就會有些不同,理論如下:
1.先做出計算到千位的轉換式子。
2.在前方加上一道程序,假設現在有一個中文段數:
九千八百七十六億五千四百三十二萬一千零九十八
3.先將零到九全改成數字,結果如下:
9|千|8|百|7|十|6|億|5|千|4|百|3|十|2|萬|1|千|0|9|十|8
4.以億與萬為中心,將上列String list切成三段:
A: 9|千|8|百|7|十|6
B: 5|千|4|百|3|十|2
C: 1|千|0|9|十|8
5.分別帶入已寫好的千位數計算式子中,轉換好後帶入以下式子:
A*100000000+B*10000+C
6.結果就會出來了。要再做出什麼樣的天文數字都不成問題,loop多跑幾圈罷了!