Você pode se aproximar com uma máscara como
'FM999999990D9999'
, com um número apropriado de 9s em cada lado do decimal para cobrir todos os valores que você possa ter. 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
O
FM
remove zeros à direita e espaços à esquerda (incluindo um espaço nominal para um sinal +/-). Para se livrar do marcador decimal à direita também, você precisa cortá-lo:
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;
Eu fiquei com
D
em ambas as partes; você pode usar um .
em ambos para que você não precise do segundo to_char()
call para converter isso, mas você pode querer que ele seja controlado pela sessão - de qualquer forma, ele precisa ser consistente. Se você não souber quantos 9s precisa incluir, poderá gerar uma máscara de formato sob medida para cada número, com base em quantos dígitos existem antes e depois do separador decimal:
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
Isso depende da conversão implícita, mas parece funcionar para positivo, negativo e zero. Ele não precisa cortar o resultado porque o separador decimal D só é incluído para números não inteiros.