数值转换为汉字

许多实用脚本和封装函数, 可以让您编写脚本更加便捷高效

Moderators: tmplinshi, arcticir

User avatar
RobertL
Posts: 546
Joined: 18 Jan 2014, 01:14
Location: China

数值转换为汉字

13 Aug 2014, 08:37

原发于AHK8帖子,以下为数值转换为汉字 V2.5
(本主题调整格式,接收回复,但不同步此副本)

@"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/41/2/3/..的变换。
      • (l+3)//4实现,1/2/3/4/5/6/7/81/1/1/12/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
别的实现方式:
我为人人,人人为己?
User avatar
huyaowen
Posts: 109
Joined: 28 Jul 2014, 01:15

Re: 数值转换为汉字

13 Sep 2014, 23:47

感谢,在用。

Return to “脚本函数”

Who is online

Users browsing this forum: No registered users and 44 guests