十进制数、to_char 和 Oracle

Posted

技术标签:

【中文标题】十进制数、to_char 和 Oracle【英文标题】:Decimal number, to_char, and Oracle 【发布时间】:2010-01-09 15:01:19 【问题描述】:

我正在尝试找出 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,这是不行的。

你有什么建议吗?

【问题讨论】:

【参考方案1】:

返回的精度需要一致,所以唯一的选择是使用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 这样的值或高于 1/等的值。

编辑 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 格式模式。

【讨论】:

正是我想要的。感谢 Oracle 搞砸了格式。 (select to_char(0,'FMD') from dual) 可以简化为to_char(0,'FMD') 可以简化为'.'【参考方案2】:

我只是用这个:

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

【讨论】:

【参考方案3】:

不要碰巧有一个方便的 Oracle 实例来测试它,但我认为

TO_CHAR(1, 'FM0.999')

应该这样做。

【讨论】:

这将给出“0.1”和“1”。的值。 好的,然后是 RTRIM(TO_CHAR(1, 'FM0.999'), '.')【参考方案4】:

不确定您期望的值范围是多少,但您可以区分 = 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

【讨论】:

以上是关于十进制数、to_char 和 Oracle的主要内容,如果未能解决你的问题,请参考以下文章

oracle forms 12. 如何显示十进制数的前导零

需要在oracle中显示十进制值

ORACLE 參数文件介绍

具有任意精度和一定比例的数字格式的 Oracle to_char 函数

C语言中十进制数和十六进制数能直接运算吗

数字逻辑8421BCD码换成十进制和二进制数