北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 8179|回复: 9

一种在ZMUD462中实现汉语数字转换为西文数字的解决方案

[复制链接]
发表于 2013-1-14 15:02:07 | 显示全部楼层 |阅读模式
本帖最后由 bluse 于 2013-1-14 03:05 PM 编辑

MUD里出现汉语数字是司空见惯的事,汉语数字符合MUD的游戏背景,同时也增加了机器人处理数字的难度。

考察我们的汉语数字,万和万以下的数位,取值都是“零”到“九”,且每一位都有明确的名称,所以实际上等同于一个算式:一百五十二就是1*100+5*10+2,三千六百二十八就是3*1000+6*100+2*10+8。但由于一些习惯,个别的特殊数字,又不完全符合这一规律,例如:一百一十在MUD里叫做一百十,一千零四并不被叫做一千四,等等。
因此,要实现转换,首先对这些非标准或习惯式的汉语数字叫法,进行规范性改造。

定义变量numlist为列表:一 二 三 四 五 六 七 八 九 十 百 千 万
上述列表中,前九项都是数字名称,后四项是数位名称。

定义触发“^??(%*)两白银~(Silver~)$白花花的银子,人见人爱的银子。”为:
total_silver=%replace(%replace(%replace(%concat(零,%1),零十,零一十),零,),百十,百一十);
#9 total_silver=%replace(@total_silver,%word(@numlist,%i),%i);
#4 total_silver=%replace(@total_silver,%word(@numlist,%i+9),*1%repeat(0,%i)+0);
total_silver=%eval(@total_silver)

解释一下:
第1行,汉语数字的规范性改造,例如一百十转换为一百一十,一千零四转换为一千四;
第2行,数字转换,将第1步结果中,一到九的字样转换为1到9,例如一百一十转换为1百1十,一千四转换为1千4;
第3行,数位转换和算式构造,将第2步结果中,十到万的字样转换为算式,例如1百1十转换为1*100+01*10,1千4转换为1*1000+04。末尾加0是为了保证“零”这个数字能被成功转换;
第4行,算式运算,将第3步的结果形成的算式进行计算,并最终保存进变量,例如1*100+01*10=110,1*1000+04=1004。

这样我们就得到了0到99999数字的中西文转换方法。

北大侠客行MUD,中国最好的MUD
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2013-1-14 15:11:50 | 显示全部楼层
超过99999的呢,比如tqt要求做xx任务几十万经验啥的
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2013-1-14 15:29:44 | 显示全部楼层
先赞一个,不过一千四和一千零四应该是两个数字吧,1400 1004
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2013-1-14 16:24:43 | 显示全部楼层
明白了,一千零四转换为一千四是为了方便计算
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2013-1-14 16:37:27 | 显示全部楼层
假胸啥时候分遗产
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2013-1-14 16:56:43 | 显示全部楼层
连续看了楼主两篇文章,有所感悟,借花献佛
假设我手上有一个金额字符串#var strMoney {一千二百三十四兆五千六百七十八亿九千一百二十三万四千五百六十七}
则,可以将“兆”“亿”“万”分别视为分隔符,依次执行
#var m1 %word(@strMoney,1,兆)
#var strMoney %delitem(@m1兆,@strMoney)
#var m2 %word(@strMoney,1,亿)
#var strMoney %delitem(@m2亿,@strMoney)
#var m3 %word(@strMoney,1,万)
#var m4 %delitem(@m3万,@strMoney)
则m1="一千二百三十四"、m2="五千六百七十八"、m3="九千一百二十三"、m4="四千五百六十七",
再应用楼主的方法,将四位数的汉字转数字,再分别挂上相应个数的0相加,这个数字就出来了
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2013-1-14 17:07:48 | 显示全部楼层
回复 2# zgbl


    万、亿 都不是一到九的数字能说清了,因此可以先对原始的字符串按照万、亿拆分成几个子串,每个子串再按照本文的方法解析,乘以相应的权重,最后相加。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2013-1-17 10:27:14 | 显示全部楼层
其实MUD里一百十这种说法,不符合中文习惯啊,我们都说一百一十。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2013-5-7 01:03:53 | 显示全部楼层
#var hanzinumber %1
#var hanzinumber %replace( @hanzinumber, "零", "+0")
#var hanzinumber %replace( @hanzinumber, "一", "+1")
#var hanzinumber %replace( @hanzinumber, "二", "+2")
#var hanzinumber %replace( @hanzinumber, "三", "+3")
#var hanzinumber %replace( @hanzinumber, "四", "+4")
#var hanzinumber %replace( @hanzinumber, "五", "+5")
#var hanzinumber %replace( @hanzinumber, "六", "+6")
#var hanzinumber %replace( @hanzinumber, "七", "+7")
#var hanzinumber %replace( @hanzinumber, "八", "+8")
#var hanzinumber %replace( @hanzinumber, "九", "+9")
#var hanzinumber %replace( @hanzinumber, "十", "*10")
#var hanzinumber %replace( @hanzinumber, "百", "*100")
#var hanzinumber %replace( @hanzinumber, "千", "*1000")
#var hanzinumber %replace( @hanzinumber, "万", "*10000")
#if (%begins( @hanzinumber, "*")) {#var hanzinumber %delete( @hanzinumber, 1, 1)}
#if (%begins( @hanzinumber, "+") and %pos( "*10000", @hanzinumber)<>0) {
  #var hanzinumber %insert( "(", @hanzinumber, 1)
  #var hanzinumber %replace( @hanzinumber, "*10000", ")*10000")
  }
hanzinumber=%eval( @hanzinumber)
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2013-5-7 08:45:20 | 显示全部楼层
其实MUD里一百十这种说法,不符合中文习惯啊,我们都说一百一十。
bluse 发表于 2013-1-17 02:27 AM

还有 “两百二十二”这样的。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-11-17 09:36 AM , Processed in 0.013643 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表