mud_sanc 板


LINE

※ [本文转录自 mud 看板 #1XaRstnC ] 作者: laechan (挥泪斩马云) 看板: mud 标题: [闲聊] 中文数字转阿拉伯数字 时间: Mon Nov 15 09:53:55 2021 最近有人问,思考了一下做法,以下是偏懒人做法,例如各 mud 大致都有 chinese_number 这个 simul_efun,比方: int n=12345; string sn=chinese_number(n); write(n+" = "+sn); 结果 12345 = 一万两千三百四十五 那问题就是如何把 一万两千三百四十五 转回 12345,简单的做 法是土法炼钢: int return_n(string sn) { int i=0; while(i++>=0) if(sn==chinese_number(i)) return i; } 但是这样的问题就是无效的呼叫太多,而且数字越大,回圈越久 ,这时直觉的想法就是做个简单的区别,例如假设整数最大数值 是 21 亿多: int return_n(string sn) { mixed tmps=({}); int n=0; if(strsrch(sn,"亿")) { tmps=explode(sn,"亿"); if(sizeof(tmps)<2) tmps+=({"零"}); for(i=1;i<10000;i++) if(tmps[0]==chinese_number(i)) break; n+=i*100000000; sn=tmps[1]; } if(strsrch(sn,"万")) { tmps=explode(sn,"万"); if(sizeof(tmps)<2) tmps+=({"零"}); for(i=0;i<10000;i++) if(tmps[0]==chinese_number(i)) break; n+=i*10000; sn=tmps[1]; } for(i=0;i<10000;i++) if(sn==chinese_number(i)) break; n+=i; return i; } 也就是把它拆成看多少个亿、然後底下多少个万、再底下有多少, 去各自做解析,这样回圈可以跑少一点。 进一步来说,针对多少个亿、多少个万、..,还可以做以下的解析 int return ranges(string tmp_sn) { if(strsrch(tmp_sn,"千")) return ({1000,10000}); else if(strsrch(tmp_sn,"百")) return ({100,1000}); else return ({0,100}); } 然後上面的 return_n 函数内部份做改写如下: mixed ranges=({}); if(strsrch(sn,"万")) { tmps=explode(sn,"万"); if(sizeof(tmps)<2) tmps+=({"零"}); ranges=return_ranges(tmps[0]); for(i=ranges[0];i<ranges[1];i++) if(tmps[0]==chinese_number(i)) break; n+=i*10000; sn=tmps[1]; } 它的意思是: 如果是一千两百三十四,那 for(i=1000;i<10000;i++) 就好 如果是一百二十三,那 for(i=100;i<1000;i++) 就好 如果是五十九,那 for(i=0;i<100;i++) 就好 根据以上,还可以进一步改写 return_ranges 函数: int return ranges(string tmp_sn) { int t; if(t=strsrch(tmp_sn,"千")) { switch(tmp_sn[t-2..t-1]) { case "一": return ({1000,2000}); break; case "二": case "两": return ({2000,3000}); break; case "三": return ({3000,4000}); break; . . case "九": return ({9000,10000}); break; } } 上面的判断也可以写成函数比方 return_units int return_units(string tmp_unit) { switch(tmp_unit) { case "一": return ({1000,2000}); break; case "二": case "两": return ({2000,3000}); break; // 留意 2 会有二跟两 case "三": return ({3000,4000}); break; . . case "九": return ({9000,10000}); break; } } 这样 return_ranges 就可以改写为 int return ranges(string tmp_sn) { int t; if(t=strsrch(tmp_sn,"千")) return return_units(tmp_sn[t-2,t-1]); else if(t=strsrch(tmp_sn,"百")) return return_units(tmp_sn[t-2,t-1]); // 百以下就不管了 for(i=0;i<100; 回圈数不多) else return ({0,100}); } 比方 如果是三千两百二十一,那就 for(i=3000;i<4000;i++) 那可不可以再进一步解析让回圈少跑一点呢? 可以,但是,没必要, 我一惯的想法是: 把解析写得很简单 => 程式跑起来loading大 把解析写得很复杂 => 程式跑起来loading小 那根据均值定理,必定存在一种写法,可以取得平衡,即程式解析不 用写得很精确,程式跑起来loading也不会太重就好了。 (上面的程式及函数段,我没有实际跑过,可能会有 error 要 debug) 以上,一点分享。前提是中文数字的产生均是透过 chinese_number ,例如说如果你要程式解析 "玖壹壹",这是办不到的,因为通常在 mud 里头不会把 int n=911 解成 "玖壹壹",而会解成"九百一十一" Laechan --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.33.66.104 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/mud/M.1636941239.A.C4C.html



※ 发信站: 批踢踢实业坊(ptt.cc)
※ 转录者: laechan (114.33.66.104 台湾), 11/15/2021 09:54:06
1F:→ laechan : 以上的东西其实也可以用在防机程式,即跑出一行中文 11/15 09:55
2F:→ laechan : 数字,要使用者键入它的阿拉伯数字是多少 11/15 09:56
3F:→ laechan : 全系统备份完成 12/03 12/03 08:55







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BuyTogether站内搜寻

TOP