域名查询  网站空间

域名主机 数据库空间

将阿拉伯数字转化为中文大写形式的AWK脚本

2011-08-03 08:33 来源: 作者: 网友评论 0 条 浏览次数 0
转自: 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
负壹佰亿零贰拾叁万肆仟点零陆零
上一篇: 下一篇:

相关主题:阿拉伯数字  中文大写  AWK脚本

网友评论