Estaba buscando una forma de formatear números sin spaces, períodos, ceros iniciales o posteriores (excepto un cero a la izquierda para números menores a 1 que deberían estar presentes).
Esto es frustrante porque el formato más habitual no se puede lograr fácilmente en Oracle.
Incluso Tom Kyte only suggested long complicated workaround así:
case when trunc(x)=x
then to_char(x, 'FM999999999999999999')
else to_char(x, 'FM999999999999999.99')
end x
Pero yo era capaz de encontrar la solución más corta que menciona el valor de una sola vez:
rtrim(to_char(x, 'FM999999999999990.99'), '.')
Este works as expected para todos los valores posibles:
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 |
Todavía en busca de una solución aún más corta.
Hay un acortamiento approarch con función auxiliar personalizado:
create or replace function str(num in number) return varchar2
as
begin
return rtrim(to_char(num, 'FM999999999999990.99'), '.');
end;
Pero custom pl/sql functions have significant performace overhead que no es adecuado para consultas pesadas.
la salida http://ss64.com/ora/syntax-numfmt.html para una buena lista de los diferentes formatos disponibles – jworrin
número 1, gracias por eso, respuesta actualizada. – DCookie
El problema con esta solución se produce cuando no tenemos el número exacto de dígitos después del punto decimal. ¿Qué podemos hacer en este caso? Una solución muy fea sería agregar un 'caso cuando myNum <1 luego agregarLeadingZero end case' y hacer lo mismo con números entre -1 y 0. Entonces ... ¿qué podemos hacer? –