作者hmml (hmml)
看板mud_sanc
标题Re: [心得] zMUD 数字由中文转换成阿拉伯数字
时间Sat Jun 25 03:50:03 2011
如题,依置换的极限分成三种:
1~99999
1~2147479999
1~999999999999
复杂度也随之增加,单纯跑血肉用的话使用第一种即可。
Pattern:
~为第(%1)段!
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
适用范围:1~99999。
Commands:
chnumbers="零 一 二 三 四 五 六 七 八 九 十 百 千 万 0*"
numbers="+0 +1 +2 +3 +4 +5 +6 +7 +8 +9 *10 *100 *1000 *10000 0+"
#var bloodmap %1
#loop 1,15 {#var bloodmap
%replace(@bloodmap,%word(@chnumbers,%i),%word(@numbers,%i))}
#var bloodmap %delete(@bloodmap,1,1)
#var total %eval(@bloodmap)
#say @total
说明:
01行:建立列表(string list) chnumbers,内容是将被置换前的字元。
02行:建立列表(string list) numbers,内容是将要取代中文数字的字元。
03行:将中文格式数字存入bloodmap。
04行:将bloodmap中符合chnumbers的单词,置换成nunbers中的单词。两个列表
中的单词排列位置具备相对性,不能错放。本行指令因#loop,会执行15次
,与两列表的单词数目相同。执行结果如下表列。
05行:删除bloodmap中字串的第一个字元,主要为删除*,见下表第7项。
06行:执行bloodmap中的运算式,并存入total。
07行:检视total值。
情 境 04行结果(05行删除行首字元) 06行结果
01 九万九千九百九十九 +9*10000+9*1000+9*900+9*10+9 99999
02 九万零十 +9*10000+0+10 90010
03 九万 +9*10000 90000
04 九千零十一 +9*1000+0+10+1 9011
05 九百九十 +9*900+9*10 990
06 九百 +9*900 900
07 十 *10 10
08 一 +1 1
结语:直接改成算式的写法,修掉前篇一些问题。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
适用范围:1~2147479999。
Commands:
chnumbers="零 一 二 三 四 五 六 七 八 九 十 百 千 万 亿 0*"
numbers="+0 +1 +2 +3 +4 +5 +6 +7 +8 +9 *10 *100 *1000 )*10000 )*100000000 0+"
#var bloodmap %1
#loop 1,16 {#var bloodmap
%replace(@bloodmap,%word(@chnumbers,%i),%word(@numbers,%i))}
#var bloodmap %delete(@bloodmap,1,1)
#if (%pos("万",%1)>0 or %pos("亿",%1)>0) {#var bloodmap "("@bloodmap}
#if (%pos("亿",%1)>0 and %pos("万",%1)>0) {#var bloodmap
%replace(@bloodmap,"100000000+","100000000+(")}
#var total %eval(@bloodmap)
#say @total
说明:01与02行的部份单词有些变动,加入括号来正确执行四则运算。
01行:建立列表(string list) chnumbers,内容是将被置换前的字元。
02行:建立列表(string list) numbers,内容是将要取代中文数字的字元。
03行:将中文格式数字存入bloodmap。
04行:将bloodmap中符合chnumbers的单词,置换成nunbers中的单词。两个列表
中的单词排列位置具备相对性,不能错放。本行指令因#loop,会执行16次
,与两列表的单词数目相同。
05行:删除bloodmap中字串的第一个字元,主要为删除*。
06行:补括号的指令,如果%1中有"万"或"亿",就在bloodmap最前补"(",详见下表:
07行:专门补万运算括号的行,如果%1中"万"与"亿",就把bloodmap中的"100000000+"
改成"100000000+("。详见下表:
08行:执行bloodmap中的运算式,并存入total。
09行:检视total值。
新 情 境 05行结果
06行结果 07行结果
08行结果
01 十一亿零十万十 10+1)*100000000+0+10)*10000+10
(10+1)*100000000+0+10)*10000+10 (10+1)*100000000+(0+10)*10000+10
1100100010
02 二十亿九千万 2*10)*100000000+9*1000)*10000
(2*10)*100000000+9*1000)*10000 (2*10)*100000000+(9*1000)*10000
2090000000
03 二十亿 2*10)*100000000
(2*10)*100000000 (2*10)*100000000
2000000000
04 十亿零九百万九千 10)*100000000+0+9*100)*10000+9*1000
(10)*100000000+0+9*100)*10000+9*1000 (10)*100000000+(0+9*100)*10000+9*1000
1009009000
05 九十九万 9*10+9)*10000
(9*10+9)*10000 (9*10+9)*10000
990000
06 十万零一 10)*10000+0+1
(10)*10000+0+1 (10)*10000+0+1
100001
结语:较上篇增加了十万到千亿级的判断,不过程式本身无法算到这等级,大约21亿就
出现负数了,没什麽需要就不要用,纯粹展示用。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
适用范围:1~999999999999。
Commands:
chnumbers="零 一 二 三 四 五 六 七 八 九 十 百 千 万 亿 0* |*"
numbers="+0 +1 +2 +3 +4 +5 +6 +7 +8 +9 *10 *100 *1000 )*10000 | 0+ |"
zeros="0|00|000|0000|00000|000000|0000000|00000000"
#var bloodmap %1
#loop 1,17 {#var bloodmap
%replace(@bloodmap,%word(@chnumbers,%i),%word(@numbers,%i))}
#var bloodmap %delete(@bloodmap,1,1)
#if (%pos(亿,%1)>0) {#var bloodmapE %eval(%item(@bloodmap,1))
#var bloodmap %item(@bloodmap,2)} {#var bloodmapE ""}
#if (%pos("万",%1)>0) {#var bloodmap "("@bloodmap}
#var bloodmap %eval(@bloodmap)
#var bloodmap @bloodmapE%item(@zeros,8-%len(@bloodmap))@bloodmap
#if (%len(@bloodmap)<9) {#var bloodmap %eval(@bloodmap)}
#say @bloodmap
说明:新增一条列表,并将亿以上的位数独立运算,以下则与上一个差不多,各自运
算完成後,再合并起来。
01行:建立列表(string list) chnumbers,内容是将被置换前的字元。
02行:建立列表(string list) numbers,内容是将要取代中文数字的字元。
03行:建立列表(string list) zeros,内容是一连串位数递增的0。
04行:将中文格式数字存入bloodmap。
05行:将bloodmap中符合chnumbers的单词,置换成nunbers中的单词。两个列表
中的单词排列位置具备相对性,不能错放。本行指令因#loop,会执行17次
,与两列表的单词数目相同。
06行:删除bloodmap中字串的第一个字元,主要为删除*。
07行:判断%1的值中是否有"亿",没有的话清空bloodmapE,有的话,将bloodmap中
的第一个字串放入bloodmapE并运算,第二个字串则放入bloodmap中。
08行:补括号的指令,如果%1中有"万",就在bloodmap最前补"("。
09行:执行bloodmap中的运算式。
10行:在bloodmap中存入格式为:
@bloodmapE补零@bloodmap
补零的式子:
%item(@zeros,8-%len(@bloodmap))
拆开後:
8-%len(@bloodmap):计算bloodmap的长度差千万位几个数,结果假设为
A。
%item(@zeros,A):取出zeros中,第A个字串。
11行:如果bloodmap长度小於9位,就把bloodmap再计算一次,可以清除字首不用的0。
12行:检视bloodmap值。
范例对照:
初始值:一千零十亿十万十 十亿零四十三万 三万
↓
bloodmap bloodmap bloodmap
06 行:1*1000+0+10|10)*10000+10 10|+0+4*10+3)*10000 3)*10000
↓
bloodmapE bloodmap bloodmapE bloodmap bloodmap
07 行:
1010 10)*10000+10
10 0+4*10+3)*10000 3)*10000
↓
bloodmapE bloodmap bloodmapE bloodmap bloodmap
08 行:
1010 (10)*10000+10
10 (0+4*10+3)*10000 (3)*10000
↓
bloodmapE bloodmap bloodmapE bloodmap bloodmap
09 行:
1010 100010
10 430000 30000
↓
bloodmap bloodmap bloodmap
10 行:101000100010 1000430000 00030000
↓
bloodmap bloodmap bloodmap
11 行:101000100010 1000430000 30000
结语:使用两段式计算,再接起来的写法,也是展示用。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.132.196.45
※ 编辑: hmml 来自: 220.132.196.45 (06/25 03:52)
1F:→ nahceal :只能说有神快拜了XD 06/25 05:21
2F:→ laechan :那应该可以出一个quest,请输入中文的数字,然後 06/25 06:28
3F:→ laechan :if(input_str==chinese_number(num)) hehe 06/25 06:29
4F:推 justinj :圣殿的中文数字..有些不是标准说法的..amem 06/25 09:06