2010-01-09 6 views
4

J'essaie de trouver une spécification de format de to_char() qui me donnerait le résultat suivant.Nombre décimal, to_char et Oracle

to_char(0.1, '[FORMAT_SPEC]') 

donne 0,1 et:

to_char(1, '[FORMAT_SPEC]') 

donne 1.

J'ai essayé les solutions suivantes:

to_char(0.1) 

donne » .1' .

to_char(0.1, 'FM0.099') 

donne 0,1, ce qui est correct, cependant:

to_char(1, 'FM0.099') 

donne 1,0, ce qui est correct.

Avez-vous des suggestions?

Répondre

5

la précision retourné doit être cohérente, la seule alternative est d'utiliser DECODE ou CASE déclarations pour retourner conditionnellement ce que vous avez besoin:

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

l'exemple est pas génial - on ne sait pas si votre d ata aura des valeurs comme 1.000 ou des valeurs supérieures à un/etc.

EDIT Michael-O (25/06/2013): Pour ceux qui en ont besoin idiot-proof, vous pouvez essayer:

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

Il observe automatiquement le séparateur décimal. Adaptez le modal de format secodn à votre taille de nombre.

+1

+1 pour la précision incohérente, bien repéré. – Khb

+1

Exactement ce que je cherchais. Merci Oracle pour avoir foiré le formatage. –

0

Ne pas arriver à avoir une instance Oracle pratique pour tester cela dans, mais je pense que

TO_CHAR(1, 'FM0.999') 

oughta le font.

+1

qui donnera "0.1" et "1" pour les valeurs. –

+0

OK, puis RTRIM (TO_CHAR (1, 'FM0.999'), '.') –

0

Je ne sais pas quelle gamme de valeurs que vous nous attendrons, mais vous pourriez affaire des valeurs < 1 par rapport à ceux> = 1. Dans le cas contraire, soit la fuite 0 ou à la décimale va dans votre chemin:

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 
2

je viens d'utiliser ceci:

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