Можете да се приближите с маска като 'FM999999990D9999'
, с подходящ брой 9s от всяка страна на десетичната запетая, за да покрие всички стойности, които може да имате.
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 изобщо е включен само за нецели числа.