如何用Awk为数字添加逗号分隔与两位小数(不依赖Locale)
数字千分位格式化修复(从右加逗号+保留两位小数)
输入文件 addcomma.txt
12345 34534534534 234325
期望输出(标准千分位格式)
12,345.00 34,534,534,534.00 234,325.00
当前错误输出
现有脚本错误地从左数三位添加逗号,结果如下:
12345 123,45.00 34534534534 345,34,53,45,34.00 234325 23,43,25.00
问题代码
awk '{ printf ("%-12s %20s\n", $0, addcomma($0)) } function addcomma(x, num) { if (x < 0) return "-" addcomma(-x) num = sprintf("%.2f", x) while (num ~ /[0-9][0-9][0-9][0-9]/) sub(/[0-9][0-9)[0-9][,.]/, ",&", num) return num }' addcomma.txt
修复后的脚本
awk '{ printf("%-12s %20s\n", $0, addcomma($0)) } function addcomma(x, num, parts, int_part, frac_part, len, i) { if (x < 0) return "-" addcomma(-x) # 先格式化保留两位小数 num = sprintf("%.2f", x) # 拆分整数与小数部分 split(num, parts, /\./) int_part = parts[1] frac_part = "." parts[2] len = length(int_part) # 从右往左每三位插入逗号 for (i = len - 3; i > 0; i -= 3) { int_part = substr(int_part, 1, i) "," substr(int_part, i+1) } return int_part frac_part }' addcomma.txt
修复说明
- 原脚本的
sub正则逻辑错误,是从左到右匹配插入逗号,不符合千分位规则 - 新脚本先拆分整数和小数部分,避免处理时干扰小数位
- 通过反向遍历整数部分,从右往左每三位插入逗号,完全符合千分位格式要求
- 全程不依赖任何locale设置,保证脚本可移植性
执行结果
12345 12,345.00 34534534534 34,534,534,534.00 234325 234,325.00
内容的提问来源于stack exchange,提问作者shantanuo
相关产品推荐
相关产品推荐

