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

kyang MVP++

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

思维过程

1.创建一个awk脚本文件

2.数据初始化

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

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

3.校验

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

4.规整化

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

5.提取

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

分别处理

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

  • 小数

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

  • 整数

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

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

    类似的进行处理

调用

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

代码

1.创建

1
touch num2zh

2.编写代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#!/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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 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 壹亿零壹佰零壹万零壹圆壹分
  • 标题: Linux学习笔记(八):awk实战小案例
  • 作者: kyang
  • 创建于 : 2024-10-07 13:47:55
  • 更新于 : 2025-07-11 16:56:12
  • 链接: https://blog.kyang.top/2024/10/07/Linux学习笔记(八):awk实战小案例--把数字金额用汉字表示/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论