记一次Oracle返回指定保留小数的数字问题

1 问题背景

在 Oracle 中,根据数据库中配置的保留小数位数,给数据保留对应的位数

2 Oracle to_char 函数格式化数字用法介绍

参数说明

参数 说明 示例
9 存在数字显示数字,不存在显示空格 999
0 存在数字显示数字,不存在显示 0 000
. 指定位置返回小数点 99.99
, 指定位置返回逗号 999,999,999
FM 如果是因为 9 带来的空格则删除 FM999,999,99.00
$ 数字开头返回一个美元符号 FM$999,999,99.00

实例展示

select to_char(a),
       to_char(a,'99.90'),
       to_char(a,'90.90'),
       to_char(a,'FM90.99'),
       rtrim(to_char(a,'FM90.99'),to_char(0,'.'))
from(
       select 50 a from dual
       union all select 50.57 from dual
       union all select 5.57 from dual
       union all select 0.35 from dual
       union all select 0.4 from dual
)

SQL 结果

image
结果图

从上图我们可以看出 to_char 格式化数字的时候有个坑,如果小数点前面只有 0,格式化之后 0 会丢失。

怎么解决呢,只需要在小数点前面用 0 这个占位符就可以了。

例如:格式化一个百分比,小数点后面保留 2 位,没有补 0

to_char(a,'FM990.00')

因为百分数的整数部分最多 3 位,所以要有三个占位符,防止小数点前面的 0 丢失,所以小数点前面写 0,因为小数点后面没有数字需要补 0,所以不能填 99,只能填 00。

3 oracle 的 lpad()函数

lpad 函数是 Oracle 数据库函数,lpad 函数从左边对字符串使用指定的字符进行填充。从其字面意思也可以理解,l 是 left 的简写,pad 是填充的意思,所以 lpad 就是从左边填充的意思。

语法格式如下:

lpad( string, padded_length, [ pad_string ] )

string:准备被填充的字符串

padded_length:填充之后的字符串长度,也就是该函数返回的字符串长度,如果这个数量比原字符串的长度要短,lpad 函数将会把字符串截取成从左到右的 n 个字符

pad_string:填充字符串,是个可选参数,这个字符串是要粘贴到 string 的左边,如果这个参数未写,lpad 函数将会在 string 的左边粘贴空格

实例展示

SQL> select lpad('abcde',10,'oq') from dual;
LPAD('ABCDE',10,'OQ')
---------------------
oqoqoabcde
SQL> select lpad('abcde',2) from dual;
LPAD('ABCDE',2)
---------------
ab

4 解决方案

select to_char(numa,'FM990.'|| lpad('0',保留位数,0)) from dual

通过to_char和lpad函数来转换数字,还可加上round进行四舍五入等操作





文章转载自:

https://www.cnblogs.com/520future/p/7463309.html https://blog.csdn.net/weiyanqiang2012/article/details/96970129

posted @ 2022-10-27 13:49  藤原绿海bluestraggle  阅读(76)  评论(0编辑  收藏  举报