маска формата оракула, возвращающая десятичные знаки - PullRequest
0 голосов
/ 06 июля 2018

У меня проблема с десятичными знаками при выборе. Я хотел бы получить коэффициенты в формате 10.50, 1.53, 1.004, 1200.00

select to_char(1.004,'9999.00') from dual;

из этого выбора я получаю 1,00, но мне нужно 1,004.

SELECT rtrim(to_char(10.51, '9999.999'), '0') FROM DUAL;

из этого я получаю нормально (10,51) для шансов, где последнее число не равно 0. Но когда нечетное - 10.50, я получаю 10,5, что мне не нужно, мне нужно по крайней мере два десятичных знака после точки.

Есть ли возможность обойти 2 знака после запятой, но когда я получу число с 3, чтобы показать 3 знака после запятой ...

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Попробуйте это

Select to_char(12.5, rtrim(lpad(' ',length(trunc(12.5))+1, '9'))||'.'||rtrim(lpad(' ', case when length(12.5 - trunc(12.5)) <= 2 Then 3 else length(12.5 - trunc(12.5)) end, '0'))) from dual

Примечание: измените 12,5 на любое число. он вернется согласно вашему требованию

0 голосов
/ 06 июля 2018

Вы можете использовать регулярное выражение для удаления последнего символа, только если это ноль:

regexp_replace(to_char(<value>, '9999.999'), '0$', null)

Демо-версия:

with your_table (odds) as (
  select 10.50 from dual
  union all select 1.53 from dual
  union all select 1.004 from dual
  union all select 1200.00 from dual
)
select odds, regexp_replace(to_char(odds, '9999.999'), '0$', null) as formatted
from your_table;

      ODDS FORMATTED
---------- ---------
      10.5    10.50  
      1.53     1.53  
     1.004     1.004 
      1200  1200.00  

Вы можете использовать обычные строковые функции, такие как instr и substr, но здесь это немного запутанно.

Или вы можете использовать выражение case, чтобы решить, какую модель формата использовать:

to_char(<value>,
  case when <value> = trunc(<value>, 2) then '9999.99'
       else '9999.999' end)

или

case when <value> = trunc(<value>, 2) then to_char(<value>, '9999.99')
     else to_char(<value>, '9999.999') end

или какой-то другой вариант (например, решив включить только 9).

Демо-версия:

with your_table (odds) as (
  select 10.50 from dual
  union all select 1.53 from dual
  union all select 1.004 from dual
  union all select 1200.00 from dual
)
select odds,
  case when odds = trunc(odds, 2) then to_char(odds, '9999.99')
       else to_char(odds, '9999.999')
  end as formatted
from your_table;

      ODDS FORMATTED
---------- ---------
      10.5    10.50 
      1.53     1.53 
     1.004     1.004
      1200  1200.00 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...