You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

修复说明

  1. 原脚本的sub正则逻辑错误,是从左到右匹配插入逗号,不符合千分位规则
  2. 新脚本先拆分整数和小数部分,避免处理时干扰小数位
  3. 通过反向遍历整数部分,从右往左每三位插入逗号,完全符合千分位格式要求
  4. 全程不依赖任何locale设置,保证脚本可移植性

执行结果

12345               12,345.00
34534534534    34,534,534,534.00
234325              234,325.00

内容的提问来源于stack exchange,提问作者shantanuo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 16:04:56