You need to enable JavaScript to run this app. Postgres 11.7数值格式化:保留两位小数起、删多余尾零、加千分位分隔符
优惠活动
大模型
产品
解决方案
定价
更多

Postgres 11.7数值格式化:保留两位小数起、删多余尾零、加千分位分隔符

PostgreSQL 11.7 数值格式化问题解决方案

需求说明

  • 为数值添加千分位分隔符
  • 始终最少保留两位小数,超出两位小数后的末尾零可删除

问题复现

原有使用to_char加FM修饰符的写法,在小数部分全为0时会出现不符合预期的结果:

-- 示例1:输出符合预期
SELECT to_char(54354.0010, 'FM99 999 999 990.999999'); --> 返回 54 354.001

-- 示例2:输出不符合预期,小数点及后续零全被移除
SELECT to_char(54354.0000, 'FM99 999 999 990.999999'); --> 返回 54 354.
-- 预期输出:54 354.00

问题原因:FM修饰符的作用是移除所有前导空格、末尾零和尾部小数点,因此当小数部分全为0时,会直接删除小数点及后续内容,无法满足最少保留两位小数的要求。

解决方案

可以通过子查询做基础格式化后再二次校验补全,写法如下,兼容性适配PostgreSQL 11.7版本:

SELECT 
  CASE
    -- 无小数点时补充.00
    WHEN strpos(formatted_val, '.') = 0 THEN formatted_val || '.00'
    -- 小数点后仅1位时补1个零
    WHEN length(split_part(formatted_val, '.', 2)) = 1 THEN formatted_val || '0'
    -- 其余情况直接返回
    ELSE formatted_val
  END AS final_formatted_val
FROM (
  -- 第一步先做基础格式化,可根据实际业务调整整数位、小数位的最大长度
  SELECT to_char(your_numeric_column, 'FM99 999 999 990.999999') AS formatted_val
  FROM your_table_name
) t

测试验证

输入数值输出结果是否符合要求
54354.001054 354.001是
54354.000054 354.00是
123456.7123 456.70是
987654.1234987 654.1234是

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 19:00:03