Board logo

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

作者: tmplinshi    时间: 2011-7-24 16:13     标题: 将阿拉伯数字转化为中文大写形式的AWK脚本

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

作者: CUer    时间: 2011-7-24 19:18

以前看到过一个sed版的
http://bbs.chinaunix.net/thread-1607272-1-1.html




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2