使用 to_char 函数格式化带有千位分隔符的长数字

问题描述

使用 to_char 函数,我可以很容易地用小数和千位分隔符格式化我的数字。

to_char(number,'FML999G999G999D00')

然而,为了防止小数点前有很长的数字,必须添加所有额外的组似乎是不必要的乏味。我知道会满足较短的数字,但是否有一种格式可以允许无限长的数字?

我的主要兴趣是 PostgreSQL,但我认为 Oracle 使用了几乎相同行为的相同函数。我不知道是否有其他 DBMS 使用 to_char 函数。

解决方法

至少在 Oracle 中,精度最多为 38,这意味着数字不能“无限”长。最长的整数部分格式模型(因此,您可以在对 to_number() 的所有调用中对其进行硬编码)是

99G999G999......G999

其中有 12 组 G999(每组 3 位,3 * 12 = 36,加上字符串左端的前两位数字 = 总共 38 位)。

(注意 - while 1e50power(10,50),或在非 Oracle 符号 10^5010**50 中,是 Oracle 中的有效数字,将其转换为字符带有 to_char() 和千位分隔符的字符串无效。不确定 PostgreSQL。)

如果你像我一样创意偷懒,你会注意到这个字符串的长度是 50 (4 * 12 + 2);所以你可以做这样的事情:

with
  test_inputs (num) as (
    select 598475228744158.33 from dual union all
    select -3                 from dual union all
    select 0                  from dual union all
    select null               from dual union all
    select -0.4444444         from dual
  )
select num,to_char(num,'FML' || rpad('99',50,'G999') || 'D00') as num_str
from   test_inputs
;

                 NUM NUM_STR        
-------------------- --------------------------------
  598475228744158.33 $598,475,228,744,158.33        
                  -3 -$3.00          
                   0 $.00             
            
          -0.4444444 -$.44

大多数开发人员忘记(或从未了解)格式模型可以是任何返回字符串的表达式 - 它不必是文字。

有了足够的动力,你可以做更多更有趣的事情——比如编写自己的函数来拦截格式模型并将字符串的数字和组部分扩展到最大有效长度等(我想很少有人会有足够的动力,不过。)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...