带逗号的 Oracle 格式数字删除尾随零小数

Posted

技术标签:

【中文标题】带逗号的 Oracle 格式数字删除尾随零小数【英文标题】:Oracle Format Number With Commas Remove Trailing Zero Decimals 【发布时间】:2020-04-24 16:27:56 【问题描述】:

在我的查询中,我试图用逗号输出数字,但我想删除小数点后的所有尾随零。例如:

3132000.00 -> 3,132,000

4321.10 -> 4,321.1

132.01 -> 132.01

我一直在使用 TO_CHAR,如果在数字末尾没有 .00,我就不能使用逗号。我试过的几个例子:

TO_CHAR(3132000, '999G999G990D00')) -> 3,132,000.00 -> 我想要的:3,132,000

TO_CHAR(1080000, 'TM')) -> 1080000 -> 我想要的:1,080,000

我已经搜索了高低的答案,但我还没有找到一种方法来使用逗号并删除零小数,这让我感到惊讶。我该怎么做?任何帮助将不胜感激。

【问题讨论】:

我不相信你。格式 '999G990D00' 不会产生结果 3,132,000.00。相反,它可能会显示类似###### 的内容。为什么?因为格式只有六位整数部分,而值有七位。如果您想被认真对待,请发布正确的示例。 我用随机数切换了我的字段并且没有更新格式。我更新了我的问题,以免冒犯其他人。 【参考方案1】:

唉,如果您必须在格式模型中使用组分隔符和小数分隔符,即使使用 'fm' 格式模型修饰符(使输出尽可能“短”),小数点仍然存在,即使输入是一个整数。这是因为 Oracle 将 D 解释为输出中的强制字符(小数分隔符)。

我们可能希望 Oracle 的设计者更聪明,他们在定义 'fm' 修饰符时会包含“删除整数的小数点”。他们不是。

除此之外,您的尝试中还有一些错误。您展示了整数部分有七位数字的示例,但您在格式模型中只包含了六位数字。 (您必须在格式模型中包含足够的数字以容纳输入数据中的最大数字。)您还在小数部分使用了 0,即使您不希望显示 0(如果不是)需要。这些应该是 9。

所以:您可以在不做额外工作的情况下做的最好的事情(但也请继续阅读“额外工作”解决方案):

with
  inputs (num) as (
    select 3132000.000 from dual union all
    select    4321.10  from dual union all
    select     132.01  from dual union all
    select 1080000     from dual
  )
select num, to_char(num, 'fm999G999G999D99') as str
from   inputs
;

          NUM STR            
------------- ---------------
      3132000 3,132,000.     
         4321 4,321.1        
          132 132.01         
      1080000 1,080,000.  

注意整数后面丑陋的小数点。正如我所解释的,你不能直接在格式模型中解决这个问题。

这是解决此问题的一种方法(事后需要额外的工作):

with
  inputs (num) as (
    select 3132000.000 from dual union all
    select    4321.10  from dual union all
    select     132.01  from dual union all
    select 1080000     from dual
  )
select num, rtrim(to_char(num, 'fm999G999G999D99'), '.') as str
from   inputs
;

          NUM STR            
------------- ---------------
      3132000 3,132,000      
         4321 4,321.1        
          132 132.01         
      1080000 1,080,000 

但是,这很烦人 - 事后我不应该做任何此类工作。有没有办法在使用 TO_CHAR 之前做一些准备工作?

答案是肯定的——我可以在格式模型参数中使用case 表达式。为了逻辑纯度,我更喜欢这个版本:

with
  inputs (num) as (
    select 3132000.000 from dual union all
    select    4321.10  from dual union all
    select     132.01  from dual union all
    select 1080000     from dual
  )
select num, to_char(num, case when num = trunc(num) then 'fm999G999G999'
                                    else 'fm999G999G999D99' end) as str
from   inputs
;

          NUM STR            
------------- ---------------
      3132000 3,132,000      
         4321 4,321.1        
          132 132.01         
      1080000 1,080,000

【讨论】:

BIG LIKE:“我们可能希望 Oracle 的设计者更聪明”感谢您提供的有用且非常彻底的回答!

以上是关于带逗号的 Oracle 格式数字删除尾随零小数的主要内容,如果未能解决你的问题,请参考以下文章

用逗号格式化数字PHP [重复]

Google表格十进制数,如何删除逗号并添加零

小数的 SQL 格式,用逗号表示小数,仅用于数字

带逗号和两位小数的数值格式

以逗号分隔的字符串查找目录列表,不带尾随逗号

格式化包含带前导零的小数点的数字