(本主题调整格式,接收回复,但不同步此副本)
@"huyaowen" @妖 AHK8.QA:我想显示纯中文日期,求办法,
- 数值转汉字:
形如:一,一十,一十一,一百,一百一,一百零一,一千,一千零一,一千零一十,一千一,一千一百一,一千一百一十一
不足:支持的位数较少,多了还要加判断。应该没问题了,模型正确,考虑全面!
模型:- 每(十进制)位为:0、1-9;
- 每4位为一段(称为千进级),从低至高分别为:X、十、百、千(X省略,用以下的数级表示);
- 从低至高段(称为数级)分别为:个、万、亿、兆、..(个省略,可由实际单位表示)。
考虑点:- 跳过为空的段。如,一亿〇一(而非一亿〇万〇一)
见代码变量s。- s:=Mod(l-1,4)+1。第一段的位数按实际情况取(而非4位)。
- s:=4每段4位。
- 当段内当前位非空,s减1。
- 当段内位均为0(s=0),跳过此段。
- 相邻的零仅保留一个。如,1001→一千〇一(而非一千〇〇一)
零是单独处理,见代码变量z。
位为0时,记录z,直至位非0,追加〇。 - 易读性优化:(在代码末尾,可删)
- 去掉首端的一。如,一十..→十..
- 去掉尾端的位数(十百千)。如,一百一十→一百一(但不会影响"一千零一十")
- 代码中的l:
- Mod(l-1,4)+1实现,1/2/3/4/5/6/..→1/2/3/4、1/2/3/..的变换。
- (l+3)//4实现,1/2/3/4/5/6/7/8→1/1/1/1、2/2/2/2、..的变换。
- 用到些正则~=(简化操作符)。
- 小数位。
- 英文。
- 不同级进数法(如英文)。
- ...
Code: Select all
;数值转汉字。 ;AHK_L V1 ;ahk8.com ;@RobertL n2c(n){ ;n:数字 n+=0 if not n~="^[1-9]\d*$" ;当不是整数 return static o:=["一","二","三","四","五","六","七","八","九"] ;改成其他进制试试。 ,b:=["","十","百","千"] ,m:=["","万","亿","兆"] ;从这扩展。 z:=false ;之前位是否为0 ,l:=StrLen(n)+1 ,s:=Mod(l-1,4)+1 ,c:="" ;保存结果 Loop, Parse, n { if Mod(--l,4)=0 s:=4 if(A_LoopField=0){ s-- ;跳过m ,z:=true }else if z{ c.="〇" ,z:=false } _:=Mod(l-1,4)+1 ,c.=o[A_LoopField] . (A_LoopField?b[_]:"") . ((!b[_] && s)?m[(l+3)//4]:"") } if c~="^一十." ;去掉首端的一。如,一十..→十.. c:=SubStr(c,2) if c~="[^〇].[十百千]$" ;去掉尾端的位数(十百千)。如,一百一十→一百一(但不会影响"一千零一十") c:=SubStr(c,1,-1) return c }
测试例
V1.6。仅考虑万以内的转换,含转中文年月日的可用示例:
Spoiler
别的实现方式:- 小写数字转大写数字NumToChinese(已测试,策略不同,略有超越 )
- 纯中文日期@"huyaowen"