至少在 Oracle 中,精度最多为 38,这意味着数字不能“无限”长。最长的整数部分格式模型(因此,您可以在对to_number() 的所有调用中对其进行硬编码)是
99G999G999......G999
其中有 12 个组 G999(每个组为 3 位,3 * 12 = 36,加上字符串左端的前两位 = 总共 38 位)。
(注意 - 而1e50,或power(10, 50),或在非Oracle 表示法10^50 或10**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
大多数开发人员忘记(或从不知道)格式模型可以是任何返回字符串的表达式 - 它不必是文字。
有了足够的动力,你可以做很多更奇特的事情——比如编写你自己的函数来拦截格式模型并将字符串的数字和组部分扩展到最大有效长度等。(我想很少有人会不过, 有足够的动力。)