Linux学习笔记(八):awk实战小案例--把数字金额用汉字表示

Linux学习笔记(八):awk实战小案例

怎么把数字金额用汉字表示?

思维过程

1.创建一个awk脚本文件

2.数据初始化

awk分为三部分:
BEGIN{} #主要初始化一些数据,定义一些静态值
...#中间代码
END{}

  • **我们需要初始化一个全局数组来记录汉字,方便取值,如["壹","贰",...]

3.校验

输入的校验,也许你应该校验输入值是不是一个合法金额

4.规整化

输入值,将所有输入值变成xxx.xx这样的格式方便操作

5.提取

提取出整数部分,和小数部分,并做出判断,如
全0:…
整数0: …
小数0: …
其他: …

分别处理

针对整数部分和小数部分分别编写函数进行汉字转变

  • 小数

提取出值在前面的初始化的数组中取值,如nums[i]
根据不同情况进行输出,主要处理0的情况

  • 整数

写一个方法,进行判断递归进行判断
如:

if (num >= 10000) {
		#取出剩下的
		nextNum = num % 10000;
		if (nextNum < 1000) return 递归(num / 10000) "万零" 递归(nextNum)
		return 递归(num / 10000) "万" 递归(nextNum)
}

类似的进行处理

调用

编写完成之后,进行调用看结果是否正确

代码

1.创建

touch num2zh

2.编写代码

#!/usr/bin/awk -f 
BEGIN{
  init()
}

{printf "%10s\t",$1}

!/^[+]?(([1-9][0-9]*)|0)(\.[0-9]{1,2})?$/{
  print "Error: Not a correct money"
  next
}

/+/{
  gsub(/+/,"")
}

{
  amount = sprintf("%.2f",$1)
  print num2str(amount)
}

function num2str(n)
{
  cents = substr(n,length(n) - 1,2)
  dols = substr(n,1,length(n) - 3)
  if (dols+0 == 0 && cents+0 == 0)
    return "零圆整"
  if (dols+0 == 0)
    return double2str(cents) 
  if (cents+0 == 0)
    return int2str(dols) "圆整"
  return int2str(dols) "圆" double2str(cents)
}

function int2str(n)
{
  if (n+0 >= 100000000) {
    nextNum = n % 100000000
    if (nextNum != 0 && nextNum < 10000000) 
      return int2str(int(n/100000000)) "亿零" int2str(nextNum)
    return int2str(int(n/100000000)) "亿" int2str(nextNum)
  }
  if (n+0 >= 10000) {
    nextNum = n % 10000
    if (nextNum != 0 && nextNum < 1000)
      return int2str(int(n/10000)) "万零" int2str(nextNum)
    return int2str(int(n/10000)) "万" int2str(nextNum)
  }
  if (n+0 >= 1000) {
    nextNum = n % 1000
    if (nextNum != 0 && nextNum < 100)
      return int2str(int(n/1000)) "仟零" int2str(nextNum)
    return int2str(int(n/1000)) "仟" int2str(nextNum)
  }
  if (n+0 >= 100) {
    nextNum = n % 100
    if (nextNum != 0 && nextNum < 10) 
      return int2str(int(n/100)) "佰零" int2str(nextNum)
    return int2str(int(n/100)) "佰" int2str(nextNum)
  }
  if (n+0 >= 10) {
    return int2str(int(n/10)) "拾" int2str(n%10)
  }
  if (n+0 == 0) return ""
  return nums[n]
}

function double2str(c)
{
  a = int(c/10)
  b = c % 10 
  if (a+0 == 0)
    return nums[b] "分"
  if (b+0 == 0)
    return nums[a] "角"
  return nums[a] "角" nums[b] "分"
}

function init()
{
  split("壹,贰,叁,肆,伍,陆,柒,捌,玖",nums,",")
}

3.使用

# 1.创建输入文件,如下
vi amount.txt
-300
123456.789
1234567.89
+987654.30
123456.00
3.4.5
0
100301
100300
100300.05
3000
300001
101010101.01

# 赋予可执行权限
chmod +x num2zh

#运行
./num2zh amount.txt

#结果
      -300      Error: Not a correct money
123456.789      Error: Not a correct money
1234567.89      壹佰贰拾叁万贰拾叁圆捌角玖分
+987654.30      玖拾捌万柒仟陆佰伍拾肆圆叁角
 123456.00      壹拾贰万叁仟肆佰伍拾陆圆整
     3.4.5      Error: Not a correct money
         0      零圆整
    100301      壹拾万零叁佰零壹圆整
    100300      壹拾万零叁佰圆整
 100300.05      壹拾万零叁佰圆伍分
      3000      叁仟圆整
    300001      叁拾万零壹圆整
101010101.01    壹亿零壹佰零壹万零壹圆壹分
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值