Ich suchte nach einer Möglichkeit, Zahlen ohne führende oder nachgestellte Leerzeichen, Punkte und Nullen zu formatieren (außer einer führenden Null für Zahlen kleiner als 1, die vorhanden sein sollte).
Es ist frustrierend, dass eine solche gebräuchliche Formatierung in Oracle nicht einfach erreicht werden kann.
Sogar Tom Kyte hat nur eine lange komplizierte Problemumgehung wie diese vorgeschlagen:
case when trunc(x)=x
then to_char(x, 'FM999999999999999999')
else to_char(x, 'FM999999999999999.99')
end x
Aber ich konnte eine kürzere Lösung finden, die den Wert nur einmal erwähnt:
rtrim(to_char(x, 'FM999999999999990.99'), '.')
Dies funktioniert wie erwartet für alle möglichen Werte:
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 |
Ich suche immer noch nach einer noch kürzeren Lösung.
Es gibt einen verkürzten Ansatz mit benutzerdefinierter Hilfsfunktion:
create or replace function str(num in number) return varchar2
as
begin
return rtrim(to_char(num, 'FM999999999999990.99'), '.');
end;
Aber benutzerdefinierte pl/sql-Funktionen haben einen erheblichen Leistungsaufwand, der für umfangreiche Abfragen nicht geeignet ist.