Hledal jsem způsob, jak formátovat čísla bez úvodních nebo koncových mezer, teček, nul (kromě jedné úvodní nuly pro čísla menší než 1, která by měla být přítomna).
To je frustrující, že takové nejběžnější formátování nelze v Oracle snadno dosáhnout.
Dokonce i Tom Kyte navrhl dlouhé komplikované řešení, jako je toto:
case when trunc(x)=x
then to_char(x, 'FM999999999999999999')
else to_char(x, 'FM999999999999999.99')
end x
Ale byl jsem schopen najít kratší řešení, které uvádí hodnotu pouze jednou:
rtrim(to_char(x, 'FM999999999999990.99'), '.')
Toto funguje podle očekávání pro všechny možné hodnoty:
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 |
Stále hledáme ještě kratší řešení.
K dispozici je zkracovací přístup s vlastní pomocnou funkcí:
create or replace function str(num in number) return varchar2
as
begin
return rtrim(to_char(num, 'FM999999999999990.99'), '.');
end;
Ale vlastní funkce pl/sql mají značnou režii výkonu, která není vhodná pro náročné dotazy.