2010-01-09 4 views
4

Я пытаюсь выяснить спецификацию формата to_char(), которая даст мне следующий результат.Десятичное число, to_char и Oracle

to_char(0.1, '[FORMAT_SPEC]') 

дает 0,1 и:

to_char(1, '[FORMAT_SPEC]') 

дает 1.

Я попытался следующие решения:

to_char(0.1) 

дает».1' .

to_char(0.1, 'FM0.099') 

дает 0,1, которое хорошо, однако:

to_char(1, 'FM0.099') 

дает 1,0, что не в порядке.

Есть ли у вас какие-либо предложения?

ответ

5

точность возвращается потребности быть последовательным, так что единственной альтернативой является использование DECODE или CASE заявления условно вернуть то, что вам нужно:

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

пример не велик - это не ясно, если ваш d ata будет иметь значения, такие как 1.000 или значения выше одного/и т. д.

EDIT Michael-O (2013-06-25): Для тех, кто нуждается в его защиту от дурака, вы можете попробовать:

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

Он автоматически отмечает десятичный разделитель. Адаптируйте формат secodn к вашему размеру.

+1

+1 для непоследовательной точности, хорошо заметной. – Khb

+1

Именно то, что я искал. Спасибо, Oracle за то, что он завязал форматирование. –

0

Не случится иметь экземпляр Oracle под рукой, чтобы проверить это, но я думаю, что

TO_CHAR(1, 'FM0.999') 

Oughta сделать это.

+1

Это даст "0.1" и "1." для значений. –

+0

ОК, затем RTRIM (TO_CHAR (1, 'FM0.999'), '.') –

0

Не уверен, что диапазон значений вы будете ожидать, но вы можете случае из значения < 1 по сравнению с теми,> = 1. В противном случае либо задн 0 или десятичное собирается получить в пути:

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

Я просто использовать это:

TRIM('.' FROM TO_CHAR(x, 'FM99990.999')) 
Смежные вопросы