Vous pouvez vous rapprocher avec un masque comme 'FM999999990D9999'
, avec un nombre approprié de 9 de chaque côté de la décimale pour couvrir toutes les valeurs que vous pourriez avoir.
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
La FM
supprime les zéros de fin et les espaces de début (y compris un espace nominal pour un signe +/-).
Pour vous débarrasser également de la marque décimale finale, vous devez la supprimer :
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;
Je suis coincé avec D
dans les deux parties de cela; vous pouvez utiliser un .
fixe dans les deux donc vous n'avez pas besoin du second to_char()
appelez pour convertir cela, mais vous voudrez peut-être qu'il soit contrôlé par la session - dans tous les cas, il doit être cohérent.
Si vous ne savez pas combien de 9 vous devez inclure, vous pouvez générer un masque de format sur mesure pour chaque nombre, en fonction du nombre de chiffres avant et après le séparateur décimal :
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
Cela repose sur une conversion implicite mais semble fonctionner pour le positif, le négatif et le zéro. Il n'est pas nécessaire de couper le résultat car le séparateur décimal D n'est inclus que pour les nombres non entiers.