唉,如果您必须在格式模型中使用组分隔符和小数分隔符,即使使用 '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