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 壹亿零壹佰零壹万零壹圆壹分