关键词
格式化函数,format
KingbaseES数字格式化概述
KingbaseES格式化函数提供一套强大的工具用于把各种数据类型(日期/时间、整数、浮点、数字)转换成格式化的字符串以及反过来从格式化的字符串转换成指定的数据类型。
这些函数都遵循一个公共的调用规范:第一个参数是待格式化的值,而第二个是一个定义输出或输入格式的模板。
例如:调用to_char(int, text)函数,int为要转换值,text为数值格式化模板。
可用于数字格式的模板的模式有:
模式 | 描述 |
9 | 数位(如果无意义可以被删除) |
0 | 数位(即便没有意义也不会被删除) |
. (period) | 小数点 |
, (comma) | 分组(千)分隔符 |
PR | 尖括号内的负值 |
S | 带符号的数字(使用区域) |
L | 货币符号(使用区域) |
D | 小数点(使用区域) |
G | 分组分隔符(使用区域) |
MI | 在指定位置的负号(如果数字< 0) |
PL | 在指定位置的正号(如果数字> 0) |
SG | 在指定位置的正/负号 |
RN | 罗马数字(输入在1 和3999 之间) |
TH or th | 序数后缀 |
V | 移动指定位数(参阅注解) |
EEEE | 科学记数的指数 |
模式的详细说明
• 0 指定一个总是被打印的数位,即便它包含前导/拖尾的零。9 也指定一个数位,但是如果它是前导零则会被空格替换,而如果是拖尾零并且指定了填充模式则它会被删除(对于to_number() 来说,这两种模式字符等效)。
• 模式字符S、L、D 以及G表示当前locale定义的负号、货币符号、小数点以及数字分隔符字符(见lc_monetary 和lc_numeric)。不管locale是什么,模式字符句号和逗号就表示小数点和数字分隔符。
• 对于to_char() 的模式中的一个负号,如果没有明确的规定,将为该负号保留一列,并且它将被锚接到(出现在左边)那个数字。如果S正好出现在某个9 的左边,它也将被锚接到那个数字。
• 使用SG、PL 或MI 格式化的符号并不挂在数字上面;例如,to_char(-12, 'MI9999') 生成'-??12',而to_char(-12, 'S9999') 生成'??-12'。(Oracle 里的实现不允许在9前面使用MI,
而是要求9在MI前面。)
• TH 不会转换小于零的数值,也不会转换小数。
• PL、SG 和TH 是KingbaseES 扩展。
• 在to_number 中,如果没有使用L 或TH 之类的非数据模板模式,相应数量的输入字符会被跳过,不管它们是否匹配模板模式,除非它们是数据字符(也就是数位、负号、小数点或者逗号)。例如,TH会跳过两个非数据字符。
• 带有to_char 的V 会把输入值乘上10^n,其中“n“是跟在V 后面的位数。带有to_number 的V以类似的方式做除法。to_char 和to_number 不支持使用结合小数点的V(例如,不允许99.9V99)。
• EEEE(科学记数法)不能和任何其他格式化模式或修饰语(数字和小数点模式除外)组合在一起使用,并且必须位于格式化字符串的最后(例如9.99EEEE 是一个合法的模式)。
具体示例
表达式 | 结果 |
to_char(-0.1, '99.99') | ' -.10' |
to_char(-0.1, 'FM9.99') | '-.1' |
to_char(-0.1, 'FM90.99') | '-0.1' |
to_char(0.1, '0.9') | '0.1' |
to_char(12, '9990999.9') | ' 0012.0' |
to_char(12, 'FM9990999.9') | '0012.' |
to_char(485, '999') | ' 485' |
to_char(-485, '999') | '-485' |
to_char(485, '9?9?9') | ' 4?8?5' |
to_char(1485, '9,999') | ' 1,485' |
to_char(1485, '9G999') | ' 1,485' |
to_char(148.5, '999.999') | ' 148.500' |
to_char(148.5, 'FM999.999') | '148.5' |
to_char(148.5, 'FM999.990') | '148.500' |
to_char(148.5, '999D999') | ' 148,500' |
to_char(3148.5, '9G999D999') | ' 3,148.500' |
to_char(-485, '999S') | '485-' |
to_char(-485, '999MI') | '485-' |
to_char(485, '999MI') | '485 ' |
to_char(485, 'FM999MI') | '485' |
to_char(485, 'PL999') | '+ 485' |
to_char(485, 'SG999') | '+485' |
to_char(-485, 'SG999') | '-485' |
to_char(-485, '9SG99') | '4-85' |
to_char(-485, '999PR') | '<485>' |
to_char(485, 'L999') | '¥ 485' |
to_char(485, 'RN') | ' CDLXXXV' |
to_char(485, 'FMRN') | 'CDLXXXV' |
to_char(5.2, 'FMRN') | 'V' |
to_char(482, '999th') | ' 482nd' |
to_char(485, '"Good?number:"999') | 'Good?number: 485' |
to_char(485.8, '"Pre:"999"?Post:"?.999') | 'Pre: 485?Post:?.800' |
to_char(12, '99V999') | ' 12000' |
to_char(12.4, '99V999') | ' 12400' |
to_char(12.45, '99V9') | ' 125' |
to_char(0.0004859, '9.99EEEE') | ' 4.86e-04' |
参考资料
更多金仓数据库KingbaseES信息,详见 KingbaseES产品手册