带逗号的 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 格式数字删除尾随零小数的主要内容,如果未能解决你的问题,请参考以下文章