您可以使用 'FM999999990D9999' 之类的掩码来接近,小数点后每侧都有适当的 9 以涵盖您可能拥有的所有值。
with tab1 (cola) as (
select 0.87 from dual
union select 661 from dual
union select 661.87 res from dual
union select 1.5 res from dual
)
select cola, to_char(cola, 'FM999999990D9999')
from tab1;
COLA TO_CHAR(COLA,'F
---------- ---------------
.87 0.87
1.5 1.5
661 661.
661.87 661.87
FM 删除尾随零和前导空格(包括 +/- 符号的标称空格)。
要去掉尾随的小数点标记,您需要将其修剪掉:
with tab1 (cola) as (
select 0.87 from dual
union select 661 from dual
union select 661.87 res from dual
union select 1.5 res from dual
)
select cola, rtrim(to_char(cola, 'FM999999990D9999'), to_char(0, 'FMD'))
from tab1;
我在这两个部分都坚持使用D;您可以在两者中使用固定的.,因此您不需要第二个to_char() 调用来转换它,但您可能希望它由会话控制 - 无论哪种方式都需要保持一致。
如果您不知道需要包含多少个 9,您可以根据小数点分隔符前后的位数为每个数字生成一个定制的格式掩码:
with tab1 (cola) as (
select 0.87 from dual
union all select 661 from dual
union all select 661.87 res from dual
union all select 1.5 res from dual
union all select 0.00045354543 from dual
)
select cola,
'FM' || lpad('0', length(trunc(cola)), '9')
|| case when trunc(cola) != cola
then 'D' || rpad('9', length(cola - trunc(cola)) - 1, '9')
end as format_mask,
to_char(cola,
'FM' || lpad('0', length(trunc(cola)), '9')
|| case when trunc(cola) != cola
then 'D' || rpad('9', length(cola - trunc(cola)) - 1, '9')
end) as result
from tab1;
COLA FORMAT_MASK RESULT
--------------- -------------------- --------------------
.87 FM0D99 0.87
661 FM990 661
661.87 FM990D99 661.87
1.5 FM0D9 1.5
.00045354543 FM0D99999999999 0.00045354543
这依赖于隐式转换,但似乎适用于正数、负数和零。它不需要修剪结果,因为小数分隔符 D 只包含在非整数中。