Jeg ledte efter en måde at formatere tal på uden indledende eller efterfølgende mellemrum, punktum, nuller (undtagen et indledende nul for tal mindre end 1, der skulle være til stede).
Det er frustrerende, at en sådan mest almindelig formatering ikke let kan opnås i Oracle.
Selv Tom Kyte foreslog kun en lang og kompliceret løsning som denne:
case when trunc(x)=x
then to_char(x, 'FM999999999999999999')
else to_char(x, 'FM999999999999999.99')
end x
Men jeg var i stand til at finde en kortere løsning, der kun nævner værdien én gang:
rtrim(to_char(x, 'FM999999999999990.99'), '.')
Dette fungerer som forventet for alle mulige værdier:
select
to_char(num, 'FM99.99') wrong_leading_period,
to_char(num, 'FM90.99') wrong_trailing_period,
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;
| WRONG_LEADING_PERIOD | WRONG_TRAILING_PERIOD | CORRECT |
|----------------------|-----------------------|---------|
| .25 | 0.25 | 0.25 |
| .1 | 0.1 | 0.1 |
| 1.2 | 1.2 | 1.2 |
| 13. | 13. | 13 |
| -70. | -70. | -70 |
Leder stadig efter en endnu kortere løsning.
Der er en afkortningstilgang med tilpasset hjælpefunktion:
create or replace function str(num in number) return varchar2
as
begin
return rtrim(to_char(num, 'FM999999999999990.99'), '.');
end;
Men brugerdefinerede pl/sql-funktioner har betydelige præstationsomkostninger, der ikke er egnede til tunge forespørgsler.