Je cherchais un moyen de formater les nombres sans espaces, points, zéros non signficatifs (sauf un zéro initial pour les nombres inférieurs à 1 qui doit être présent).
Il est frustrant qu'un formatage aussi courant soit difficile à réaliser dans Oracle.
Même Tom Kyte ne propose qu'une solution longue et compliquée comme celle-ci :
case when trunc(x)=x
then to_char(x, 'FM999999999999999999')
else to_char(x, 'FM999999999999999.99')
end x
Mais j'ai pu trouver une solution plus courte qui ne mentionne la valeur qu'une seule fois :
rtrim(to_char(x, 'FM999999999999990.99'), '.')
Cela fonctionne comme prévu pour toutes les valeurs possibles :
select
to_char(num, 'FM99.99') mauvais_point_début,
to_char(num, 'FM90.99') mauvais_point_fin,
rtrim(to_char(num, 'FM90.99'), '.') correct
from (
select num from (select 0.25 c1, 0.1 c2, 1.2 c3, 13 c4, -70 c5 from dual)
unpivot (num for dummy in (c1, c2, c3, c4, c5))
) sampledata;
| MAUVAIS_POINT_DEBUT | MAUVAIS_POINT_FIN | CORRECT |
|----------------------|-----------------------|---------|
| .25 | 0.25 | 0.25 |
| .1 | 0.1 | 0.1 |
| 1.2 | 1.2 | 1.2 |
| 13. | 13. | 13 |
| -70. | -70. | -70 |
Toujours à la recherche d'une solution encore plus courte.
Il existe une approche de raccourcissement avec une fonction d'aide personnalisée :
create or replace function str(num in number) return varchar2
as
begin
return rtrim(to_char(num, 'FM999999999999990.99'), '.');
end;
Mais les fonctions PL/SQL personnalisées ont un surcoût significatif en performances qui ne sont pas adaptées aux requêtes lourdes.