Szukałem sposobu na formatowanie liczb bez spacji wiodących lub końcowych, kropek, zer (z wyjątkiem jednego wiodącego zera dla liczb mniejszych niż 1, które powinno być obecne).
To frustrujące, że tak typowego formatowania nie da się łatwo osiągnąć w Oracle.
Nawet Tom Kyte zasugerował tylko długie, skomplikowane obejście, takie jak to:
case when trunc(x)=x
then to_char(x, 'FM999999999999999999')
else to_char(x, 'FM999999999999999.99')
end x
Ale udało mi się znaleźć krótsze rozwiązanie, które wymienia wartość tylko raz:
rtrim(to_char(x, 'FM999999999999990.99'), '.')
Działa to zgodnie z oczekiwaniami dla wszystkich możliwych wartości:
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 |
Nadal szukam jeszcze krótszego rozwiązania.
Istnieje podejście skracające z niestandardową funkcją pomocniczą:
create or replace function str(num in number) return varchar2
as
begin
return rtrim(to_char(num, 'FM999999999999990.99'), '.');
end;
Ale niestandardowe funkcje pl/sql mają znaczny narzut na wydajność, który nie jest odpowiedni dla ciężkich zapytań.