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



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

to_char(number,'FML999G999G999D00')

然而,如果我在小数点前有一个很长的数字,就必须把所有额外的组加起来,这似乎是不必要的乏味。我知道更短的数字会被满足,但是有没有一种格式允许无限长的数字?

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

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

99G999G999......G999

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

(注意-虽然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

大多数开发人员忘记了(或者从来没有学过)格式模型可以是任何返回字符串的表达式——它不一定是字面量。

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