【问题标题】:Oracle - Format number with fullstop for thousand and comma for decimalsOracle - 格式化数字,用句号表示千位,用逗号表示小数
【发布时间】:2015-03-25 00:49:15
【问题描述】:

我有一个像 3225,69 这样的数字,我想将显示转换为:

3.225,69

简单地说,我需要句号来分隔千位和逗号来分隔小数:

3,69 -> 3,69 
1000 -> 1.000 
1500,20 -> 1.500,20
1 -> 1 (not 1,000)

我应该在 to_char 中使用哪个掩码?

我是我的数据库列,逗号表示小数。

【问题讨论】:

  • 数据库/变量中存储的数字是数字还是字符串?
  • 在数据库列中存储为 NUMBER。现在我正在使用掩码 9G999G999D000,它适用于数字 32546,122(转换为 32.546,122)。但是,如果我将数字设为 1000,则转换为 1.000,000(逗号后的 3 个零必须消失)。就像在说“掩码中 D 后面的 000 应该是可选的,如果没有必要不要放这个”
  • 所以用D999而不是D000结束你的面具?
  • 没什么变化,如果我使用掩码 9G999G999D999 并尝试格式化数字 1,我得到:1,000

标签: sql oracle number-formatting


【解决方案1】:

你可以试试这个

select rtrim(to_char(to_char(1, 'FM9G999G999D999', 'NLS_NUMERIC_CHARACTERS='',.'''), 'FM9G999G999D999', 'NLS_NUMERIC_CHARACTERS='',.'''),',') from dual;

希望对你有帮助

【讨论】:

    【解决方案2】:

    您可以使用 FM format modifier 将尾随的十进制零清除:

    select to_char(1, 'FM9G999G999D999', 'NLS_NUMERIC_CHARACTERS='',.''') from dual;
    
    TO_CHAR(1,'FM9G999G999D999','NLS_NUMERIC_CHARACTERS='',.''')
    ------------------------------------------------------------
    1,      
    

    但正如你所见,它留下了十进制字符;你可以把它剪掉:

    with t as (
     select 3.69 as n from dual
     union all select 1000 from dual
     union all select 150.20 from dual
     union all select 1 from dual
     union all select 0.16 from dual
    )
    select n,
      to_char(n, '9G999G999D000') original,
      to_char(n, 'FM9G999G999D999', 'NLS_NUMERIC_CHARACTERS='',.''') new,
      rtrim(to_char(n, 'FM9G999G999D999', 'NLS_NUMERIC_CHARACTERS='',.'''),
        ',') as trimmed
    from t;
    
             N ORIGINAL       NEW            TRIMMED       
    ---------- -------------- -------------- --------------
          3.69          3.690 3,69           3,69           
          1000      1,000.000 1.000,         1.000          
         150.2        150.200 150,2          150,2          
             1          1.000 1,             1            
           .16           .160 ,16            ,16            
    

    我正在使用the to_char() function 的可选第三个 NLS 参数来独立于我的会话设置来设置 G 和 D 字符。

    如果您想保留小数点分隔符前的零,只需将D 之前的最后一个9 变成0

    with t as (
     select 3.69 as n from dual
     union all select 1000 from dual
     union all select 150.20 from dual
     union all select 1 from dual
     union all select 0.16 from dual
    )
    select n,
      to_char(n, '9G99G990D000') original,
      to_char(n, 'FM9G999G990D999', 'NLS_NUMERIC_CHARACTERS='',.''') new,
      rtrim(to_char(n, 'FM9G999G990D999', 'NLS_NUMERIC_CHARACTERS='',.'''),
        ',') as trimmed
    from t;
    
             N ORIGINAL      NEW            TRIMMED       
    ---------- ------------- -------------- --------------
          3.69         3.690 3,69           3,69           
          1000     1,000.000 1.000,         1.000          
         150.2       150.200 150,2          150,2          
             1         1.000 1,             1              
           .16         0.160 0,16           0,16           
    

    【讨论】:

    • 感谢您的回复!这真的很有帮助!
    • 有了这个公式,我有一个“小”问题。如果数字是 0,16,我得到 ,16。我失去了最初的零
    • @Mistre83 - 更新为使用...0D... 格式模型的版本。
    • 哇.....为了得到这个作品,我使用了一个愚蠢的解决方法,如果第一个字符是逗号,则添加零......我真的很难理解这个公式.你知道解释所有这种格式的网站吗?我试图在网上搜索,但没有。通常我想了解我写的内容。该解决方案是完美的工作,但我也想了解它:)
    • @Mistre83 - 我已经linked to the doc that has the number format models。这显示了FMDG90 元素的作用。可能有这么多排列,你不可能在别处找到完全匹配的解释,也许。
    猜你喜欢
    • 2019-01-25
    • 1970-01-01
    • 2017-08-23
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-06
    相关资源
    最近更新 更多