我试图找出to_char()的格式规范,它会给我以下结果。
to_char(0.1, '[FORMAT_SPEC]')
给出0.1和:
to_char(1, '[FORMAT_SPEC]')
给出1。
我尝试过以下解决方案:
to_char(0.1)
给出'.1'。
to_char(0.1, 'FM0.099')
给出0.1,但没关系:
to_char(1, 'FM0.099')
给出1.0,这是不行的。
你有什么建议吗?
答案 0 :(得分:5)
返回的精度需要保持一致,因此唯一的选择是使用DECODE或CASE语句有条件地返回您需要的内容:
CASE
WHEN INSTR(TO_CHAR(t.col), '.') = 0 THEN TO_CHAR(t.col)
ELSE TO_CHAR(t.col, 'FM0.099')
END
示例并不是很好 - 不清楚您的数据是否会包含1.000
之类的值或高于1 /等的值。
case
when instr(to_char(<col>), (select to_char(0, 'FMD') from dual)) = 0
then to_char(<col>)
else to_char(<col>, 'FM999990D999')
end
它会自动观察小数点分隔符。将secodn格式模式调整为您的数字大小。
答案 1 :(得分:2)
我只是用这个:
TRIM('.' FROM TO_CHAR(x, 'FM99990.999'))
答案 2 :(得分:0)
不要碰巧有一个Oracle实例来测试它,但我认为
TO_CHAR(1, 'FM0.999')
做到这一点。
答案 3 :(得分:0)
不确定您期望的值范围,但您可以将值&lt; 1与那些&gt; = 1.否则尾随0或小数将会妨碍你:
select val,
case when val < 1 then to_char(val, 'FM99990.9')
else to_char(val, 'FM99999')
end fmt
from (select 0.1 val from dual union all
select 1 from dual
)
/
VAL FMT
---------- --------
.1 0.1
1 1