数字模式用于格式化和解析
描述
函数例如
to_number
和
to_char
支持在字符串和十进制类型之间进行转换。这些函数接受格式字符串,指示如何在这些类型之间映射。
语法
数字格式字符串支持以下语法:
{ ' [ MI | S ] [ $ ]
[ 0 | 9 | G | , ] [...]
[ . | D ]
[ 0 | 9 ] [...]
[ $ ] [ PR | MI | S ] ' }
元素
每个数字格式字符串可以包含以下元素(不区分大小写):
-
0
或9
指定一个期望的数字,范围在
0
和9
之间。格式字符串中的 0 或 9 的序列匹配同样大小或更小的数字序列。如果 0/9 序列以 0 开头并且在小数点之前,它要求完全匹配数字的位数:在解析时,仅匹配大小相同的数字序列;在格式化时,结果字符串会在数字序列左侧添加零来达到相同的大小。否则,0/9 序列在解析时匹配任何大小相同或更小的数字序列,并在格式化时对结果字符串中的数字序列进行填充(如果在小数点前)或用零填充(如果在小数点后)。注意,如果大小大于 0/9 序列,数字序列在格式化时将变为 ‘#’ 序列。
-
.
或D
指定小数点的位置。该字符只能指定一次。
在解析时,输入字符串不需要包含小数点。
-
,
或G
指定
,
分组(千位)分隔符的位置。每个分组分隔符左侧和右侧必须有一个
0
或9
。在解析时,输入字符串必须匹配与数字大小相关的分组分隔符。 -
$
指定
$
货币符号的位置。该字符只能指定一次。 -
S
指定一个可选的 ‘+’ 或 ‘-‘ 符号的位置。该字符只能指定一次。
-
MI
指定一个可选的 ‘-‘ 符号的位置(没有 ‘+’)。该字符只能指定一次。
在格式化时,正值将打印一个空格。
-
PR
将负输入值映射到对应字符串中的尖括号 (
<1>
)。正输入值不会得到尖括号。
函数类型和错误处理
-
to_number
函数接受一个输入字符串和一个格式字符串参数。它要求输入字符串与提供的格式匹配,否则会引发错误。该函数返回相应的十进制值。 -
try_to_number
函数接受一个输入字符串和一个格式字符串参数。它的工作方式与to_number
函数相同,不同之处在于如果输入字符串不匹配给定的数字格式,它会返回NULL而不是引发错误。 -
to_char
函数接受一个输入十进制数和一个格式字符串参数。该函数返回相应的字符串值。 - 如果给定的格式字符串无效,则所有函数都会失败。
示例
以下示例使用了
to_number
,
try_to_number
和
to_char
SQL 函数。
请注意,大多数示例中使用的格式字符串期望:
- 可选的符号在开头,
- 后面跟着美元符号,
- 后面跟着一个介于 3 到 6 位数之间的数字,
- 千位分隔符,
- 小数点后最多两位数字。
转换为数字的
to_number
函数
-- 带货币符号的负数映射到格式字符串中的字符。
> SELECT to_number('-$12,345.67', 'S$999,099.99');
-12345.67
-- '$' 符号是必需的。
> SELECT to_number('5', '$9');
Error: 输入 字符串 与 给定的 数字 格式 不匹配
-- '+' 符号是可选的,小数位数也是可选的。
> SELECT to_number('$345', 'S$999,099.99');
345.00
-- 格式至少需要三个数字。
> SELECT to_number('$45', 'S$999,099.99');
Error: 输入 字符串 与 给定的 数字 格式 不匹配
-- 格式至少需要三个数字。
> SELECT to_number('$045', 'S$999,099.99');
45.00
-- MI 表示输入字符串开始或结束的可选负号。
> SELECT to_number('1234-', '999999MI');
-1234
-- PR 表示可选的包裹角括号。
> SELECT to_number('9', '999PR')
9
函数
try_to_number
:
-- '$'符号不是可选的。
> SELECT try_to_number('5', '$9');
NULL
-- 格式要求至少三个数字。
> SELECT try_to_number('$45', 'S$999,099.99');
NULL
函数
to_char
:
> SELECT to_char(decimal(454), '999');
"454"
-- '99' 可以以更小的大小格式化数字序列。
> SELECT to_char(decimal(1), '99.9');
" 1.0"
-- '000' 为更小的数字序列左边填充0。
> SELECT to_char(decimal(45.1), '000.00');
"045.10"
> SELECT to_char(decimal(12454), '99,999');
"12,454"
-- 较大的数字序列会导致 '#' 序列。
> SELECT to_char(decimal(78.12), '$9.99');
"$#.##"
-- 'S' 可以在末尾。
> SELECT to_char(decimal(-12454.8), '99,999.9S');
"12,454.8-"
> SELECT to_char(decimal(12454.8), 'L99,999.9');
Error: cannot resolve 'to_char(Decimal(12454.8), 'L99,999.9')' 由于 数据 类型 不匹配:
意外的 字符 'L' 在 格式 字符串 'L99,999.9'中找到; 格式 字符串 的结构 必须 匹配: [MI|S] [$] [0|9|G|,]* [.|D] [0|9]* [$] [PR|MI|S]; 行 1 位置 25