【问题标题】:format a lengthy number with commas in Oracle在 Oracle 中用逗号格式化一个冗长的数字
【发布时间】:2017-02-27 18:16:21
【问题描述】:

我需要将非常长的金额转换为comma separated value in oracle。我在谷歌搜索。但我得到了一些只适用于少数人的解决方案。但不是为了冗长的数字。以下是我的解决方案。但不能正常工作。我得到############... 如果我运行以下。

SELECT TO_CHAR(6965854565787645667634565432234565432345643265432345643242087,
'99G999G999G9999', 'NLS_NUMERIC_CHARACTERS=",."') as test
FROM dual;

期望的输出:

6,965,854,565,787,645,667,634,565,432,234,565,432,345,643,265,432,345,643,242,087

请帮助我。提前致谢。

【问题讨论】:

  • 这个数字来自哪里,是什么数据类型?如果它已经是一个字符串,你可以这样做,但正如 mathguy 所说的那样,它超出了 Oracle 允许的精度。

标签: sql database oracle oracle11g


【解决方案1】:

请检查以下查询是否有帮助。

SELECT ltrim(regexp_replace('00'
  || '6965854565787645667634565432234565432345643265432345643242087', '(...)', ',\1' ),',|0') AS t
FROM dual;

【讨论】:

    【解决方案2】:

    Oracle 中的数字不能超过 38 个有效数字。你还有很多。

    如果可以,那是什么“数量”?我的理解是,Oracle 旨在处理现实生活中的价值。您发布的示例编号有什么可能的含义?

    已添加:评论中的原始发帖人(如下)表示,他遇到了同样的错误,但数字更短,只有 34 位。

    两个问题。首先,格式模型必须至少具有所需的位数(9 位)。 to_char(100000, '9G999') 将产生输出 #### 因为格式模型只允许 4 位数字,但输入是 6 位数字。

    然后,在更正之后,输出在前端应用程序中可能仍然看起来不正确,例如 SQL*Plus。在 SQL*Plus 中,数字列的默认宽度是 10(我相信)。可以将其更改为 38,例如使用命令 set numwidth 38。在其他前端,如 Toad 和 SQL Developer,默认数字宽度是可以通过图形用户界面更改的设置。

    添加更多 - 实际上to_char 的结果是一个字符串,默认情况下,任何长度的字符串都应该在任何前端显示OK,因此数字宽度可能无关紧要。 (而且,无论如何,它不影响字符串的显示,包括to_char()的结果。)

    【讨论】:

    • 这个数字比宇宙中的原子数还多... ;)
    • 我试过这个小于 38 位的数字。 6965854565787645667634565432234565 它仍然显示相同的#####...
    • @SreeBhanu - 好的,我添加到我的初始答案中。
    【解决方案3】:
        SELECT TO_CHAR(
        6676345654322345654323456432654323456, 
        '999G999G999G999G999G999G999G999G999G999G999G999G999',
    'NLS_NUMERIC_CHARACTERS=",."') as test FROM dual
    
        TEST
        ------------------------------------------------------------
           6,676,345,654,322,345,654,323,456,432,654,323,456
    

    【讨论】:

    • 我不确定这是否有效。如果你真的尝试使用 OP 给我们的号码,你会得到一个 ORA-01481(无效的号码格式模型)。
    • 根据他的更新,这是一个 38 位的数字。
    • 不需要column 命令;默认情况下,SQL*Plus 将扩展以容纳字符串列中最长的字符串。
    • @mathguy。哈!不知道。一直在学习;)我会适当地编辑我的帖子......
    【解决方案4】:

    @AlexPoole 指出您的输入可能是一个字符串。

    我没有那种氛围;但如果实际上您的输入是一个字符串,并且您知道长度不超过 99 位,您可以执行以下操作。如果您的字符串可能超过 99,请将下面的 99 替换为 3 的足够大的倍数。(或者,您可以将其替换为计算值,3 * ceil(length(str)/3))。

    with
         inputs ( str ) as (
           select '12345678912345' from dual
         )
    -- WITH clause is only for testing/illustration, not part of the solution
    select ltrim(regexp_replace(lpad(str, 99, ','), '(.{3})', ',\1'), ',') as test
    from   inputs;
    
    TEST
    ------------------
    12,345,678,912,345
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-31
      • 2014-05-31
      • 2020-12-18
      • 2017-12-09
      • 2011-11-08
      • 1970-01-01
      相关资源
      最近更新 更多