【问题标题】:Using the to_char function to format long numbers with thousands separators使用 to_char 函数格式化带有千位分隔符的长数字
【发布时间】:2021-03-01 00:08:15
【问题描述】:

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

to_char(number,'FML999G999G999D00')

但是,如果我在小数点前有一个长数字,则必须添加所有额外的组似乎是不必要的乏味。我知道会处理较短的数字,但是有没有一种格式可以允许无限长的数字?

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

【问题讨论】:

    标签: postgresql oracle formatting to-char


    【解决方案1】:

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

    99G999G999......G999
    

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

    (注意 - 而1e50,或power(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
    

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

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

    【讨论】:

    • PostgreSQL 没有那么大的限制,numeric 是一个二进制编码的十进制,最大可达 1GB。但答案是一样的:你必须写一个足够长的模式来满足你最长的数字。
    猜你喜欢
    • 1970-01-01
    • 2011-03-12
    • 2020-03-15
    • 2012-03-11
    • 2018-05-11
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多