Número decimal, to_char y Oracle

Estoy tratando de averiguar una especificación de formatting de to_char () que me daría el siguiente resultado.

to_char(0.1, '[FORMAT_SPEC]') 

da 0.1 y:

 to_char(1, '[FORMAT_SPEC]') 

da 1.

He intentado las siguientes soluciones:

 to_char(0.1) 

da '.1'.

 to_char(0.1, 'FM0.099') 

da 0.1, lo cual está bien, sin embargo:

 to_char(1, 'FM0.099') 

da 1.0, que no está bien.

¿Tienes alguna sugerencia?

La precisión devuelta debe ser coherente, por lo que la única alternativa es usar declaraciones DECODE o CASE para devolver condicionalmente lo que necesita:

 CASE WHEN INSTR(TO_CHAR(t.col), '.') = 0 THEN TO_CHAR(t.col) ELSE TO_CHAR(t.col, 'FM0.099') END 

El ejemplo no es excelente: no está claro si sus datos tendrán valores como 1.000 o valores superiores a uno / etc.

EDIT Michael-O (2013-06-25): Para aquellos que lo necesitan a testing de idiotas, puede intentar:

 case when instr(to_char(<col>), (select to_char(0, 'FMD') from dual)) = 0 then to_char(<col>) else to_char(<col>, 'FM999990D999') end 

Observa automáticamente el separador decimal. Adapte el formatting modal seco al tamaño de su número.

Solo uso esto:

 TRIM('.' FROM TO_CHAR(x, 'FM99990.999')) 

No tengo a mano una instancia de Oracle para probar esto, pero creo que

 TO_CHAR(1, 'FM0.999') 

oughta hazlo.

No estoy seguro de qué range de valores va a esperar, pero podría descartar valores <1 frente a aquellos> = 1. De lo contrario, el 0 final o el decimal se interpondrán en su path:

 select val, case when val < 1 then to_char(val, 'FM99990.9') else to_char(val, 'FM99999') end fmt from (select 0.1 val from dual union all select 1 from dual ) / VAL FMT ---------- -------- .1 0.1 1 1