找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 21275|回复: 1

[转载教程] 将阿拉伯数字转化为中文大写形式的AWK脚本

[复制链接]
发表于 2011-7-24 16:13:56 | 显示全部楼层 |阅读模式
转自: http://blah.blogsome.com/2006/03/30/awk-chi/
  1. #!/usr/bin/gawk -f
  2. # 1234567890 壹贰叁肆伍陆柒捌玖零
  3. # 说明:单位以“亿亿”表示10的16次方,而“亿亿亿”表示
  4. # 10的24次方,依此类推
  5.        
  6. # 自定义函数setunits():为数字增加中文单位
  7. # setunits(起始位,结束位,亿的个数, ...局部变量)
  8. # 一般以8 个为一个单位
  9. func setunits(off1,off2,state,   i,j){
  10.         for(i=off2;i>=off1;i--) {
  11.                 if (off2-i==4) $i=$i "万"
  12.                 else if($i!="0") $i=$i p[(off2-i)%4]
  13.            }
  14.         # 每8位state就增加1,用来控制单位中“亿”的个数。
  15.         j=state; while(j--) $off2=$off2 "亿"
  16.         # 退出条件
  17.         if (off1==1) return
  18.         else if (off1<=9) setunits(1,off1-1,++state)
  19.         else setunits(off1-8,off1-1,++state)
  20. }
  21.        
  22. # 自定义函数conv_num():将数字转换为中文
  23. # 定义局部变量i
  24. func conv_num(  i){
  25.         # 注意下面替换的顺序
  26.         sub(/0*\./,"点")
  27.         # 清除连续的0
  28.         gsub(/0000万0000[亿]+/,"")
  29.         gsub(/0000万/,"")
  30.         gsub(/0+亿/,"亿")
  31.         gsub(/0+万/,"万")
  32.         gsub(/0+/,"0")
  33.         sub(/^[亿万]+/,"")
  34.         #清除首尾的0
  35.         sub(/^00*/,"")
  36.         sub(/00*$/,"")
  37.         sub(/^$/,"零")
  38.         sub(/^点/,"零点")
  39.         # 替换阿拉伯数字为中文
  40.         for(i in a) gsub(i-1,a[i])
  41. }
  42.        
  43. # 主程序体 -------------------------
  44. # 设置栏位的输入和输出的分隔符为空字串
  45. BEGIN{  FS=OFS=""
  46.         split("拾,佰,仟,万",p,",")
  47.         split("零,壹,贰,叁,肆,伍,陆,柒,捌,玖",a,",")
  48.      }
  49.        
  50. { gsub(/,/,"") } #允许输入 123,456.789 的形式
  51.        
  52. # 验证输入。这里没有对多个小数点进行验证。
  53. /^[-0-9][0-9.]*$/{
  54.        
  55.         # 判断正负
  56.         isNeg=(sub(/^-/,""))
  57.        
  58.         # 小数点前的数字进行单位设置
  59.         if (dotpos=index($0,".")) {
  60.                 of2=dotpos-1
  61.                 for (i=of2+2;i<=NF;i++) $i=a[$i+1]
  62.         }else of2=NF
  63.         if (of2>8) setunits(of2-7,of2,0)
  64.         else setunits(1,of2,0)
  65.        
  66.         # 阿拉伯数字转为中文数字
  67.         conv_num()
  68.        
  69.         # 还原正负号
  70.         if (isNeg && $0!="零") print "负" $0
  71.         else print
  72.         }
  73.        
  74. # 程序结束 -------------------------
复制代码
将上面的脚本保存为”chfig.awk”(当然你可以随意地命名)。这是运行结果:
hq00e@somewhere ~
$ echo 98.76543210|gawk -f chfig.awk
玖拾捌点柒陆伍肆叁贰壹零
       
hq00e@somewhere ~
$ echo -10000234000.060|gawk -f chfig.awk
负壹佰亿零贰拾叁万肆仟点零陆零
发表于 2011-7-24 19:18:56 | 显示全部楼层
以前看到过一个sed版的
http://bbs.chinaunix.net/thread-1607272-1-1.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 01:12 , Processed in 0.016648 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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