Десятичное число, to_char и Oracle - PullRequest
4 голосов
/ 09 января 2010

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

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, что нехорошо.

У вас есть предложения?

Ответы [ 4 ]

5 голосов
/ 09 января 2010

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

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

Пример не велик - неясно, будут ли ваши данные иметь такие значения, как 1.000 или значения выше единицы / и т.д.

РЕДАКТИРОВАТЬ 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 к размеру вашего номера.

2 голосов
/ 25 июня 2013

Я просто использую это:

TRIM('.' FROM TO_CHAR(x, 'FM99990.999'))
0 голосов
/ 09 января 2010

Не уверен, какой диапазон значений вы ожидаете, но вы можете выделить значения <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
0 голосов
/ 09 января 2010

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

TO_CHAR(1, 'FM0.999')

Да, сделай это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...