跳到主要内容

转换为 DECIMAL

From string

严格模式

如果源类型是nullable,返回nullable类型;

如果源类型是非nullable,返回非nullable类型;

BNF定义

<decimal>     ::= <whitespace>* <value> <whitespace>*

<whitespace> ::= " " | "\t" | "\n" | "\r" | "\f" | "\v"

<value> ::= <sign>? <significand> <exponent>?

<sign> ::= "+" | "-"

<significand> ::= <digits> "." <digits> | <digits> | <digits> "." | "." <digits>

<digits> ::= <digit>+

<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"

<exponent> ::= <e_marker> <sign>? <digits>

<e_marker> ::= "e" | "E"

规则描述

  • 只支持十进制数字;

  • 支持科学计数法;

  • 支持四舍五入;

  • 字符串允许有任意数量的前缀空格和后缀空格,空格字符包括:" ", "\t", "\n", "\r", "\f", "\v"。

  • 整数部分溢出时报错;

  • 非法格式报错。

例子

字符串Decimal(18, 6)comment
"123.1234567"123.123457四舍五入
"12345."12345.000000
"12345"12345.000000
".123456"0.123456
" \t\r\n\f\v123.456 \t\r\n\f\v"123.456000带前缀和后缀空白字符
" \t\r\n\f\v+123.456 \t\r\n\f\v"123.456000带前缀和后缀空白字符,带正号。
" \t\r\n\f\v-123.456 \t\r\n\f\v"-123.456000带前缀和后缀空白字符,带负号。
" \t\r\n\f\v+1.234e5 \t\r\n\f\v"123400.000000科学计数法。
" \t\r\n\f\v+1.234e+5 \t\r\n\f\v"123400.000000科学计数法,指数带正号。
" \t\r\n\f\v+1.234e-1 \t\r\n\f\v"0.123400科学计数法,指数带负号。
"123.456a"报错非法格式。
"1234567890123.123456"报错溢出

非严格模式

始终返回nullable类型;

BNF定义

<decimal>     ::= <whitespace>* <value> <whitespace>*

<whitespace> ::= " " | "\t" | "\n" | "\r" | "\f" | "\v"

<value> ::= <sign>? <significand> <exponent>

<sign> ::= "+" | "-"

<significand> ::= <digits> | <digits> "." <digits> | <digits> "." | "." <digits>

<digits> ::= <digit>+

<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"

<exponent> ::= <e_marker> <sign>? <digits>

<e_marker> ::= "e" | "E"

规则描述

  • 支持严格模式下的所有合法格式;

  • 溢出时转成NULL值;

  • 非法格式转成NULL值。

例子

字符串Decimal(18, 6)comment
"123.1234567"123.123457四舍五入
"12345."12345.000000
"12345"12345.000000
".123456"0.123456
" \t\r\n\f\v123.456 \t\r\n\f\v"123.456000带前缀和后缀空白字符
" \t\r\n\f\v+123.456 \t\r\n\f\v"123.456000带前缀和后缀空白字符,带正号。
" \t\r\n\f\v-123.456 \t\r\n\f\v"-123.456000带前缀和后缀空白字符,带负号。
" \t\r\n\f\v+1.234e5 \t\r\n\f\v"123400.000000科学计数法。
" \t\r\n\f\v+1.234e+5 \t\r\n\f\v"123400.000000科学计数法,指数带正号。
" \t\r\n\f\v+1.234e-1 \t\r\n\f\v"0.123400科学计数法,指数带负号。
"123.456a"NULL非法格式。
"1234567890123.123456"NULL溢出

From bool

true转成1,false转成0。

严格模式

溢出时报错(比如cast bool as decimal(1, 1))。

如果源类型是nullable,返回nullable类型。

如果源类型是非nullable,返回非nullable类型。

非严格模式

溢出时转成NULL。

如果源类型是nullable,返回nullable类型。

如果源类型是非nullable:

  • 如果可能溢出(比如cast bool as decimal(1, 1)),返回nullable类型;

  • 否则返回非nullable类型。

From integer

严格模式

溢出时报错。

如果源类型是nullable,返回nullable类型。

如果源类型是非nullable,返回非nullable类型。

例子

intDecimal(18, 9)Comment
123123.00000000
2147483647报错溢出

非严格模式

溢出时转成NULL值。

如果源类型是nullable,返回nullable类型。

如果源类型是非nullable:

  • 如果可能溢出(比如cast int as decimal(1, 0)),返回nullable类型;

  • 否则返回非nullable类型(比如cast int as decimal(18, 0))。

例子

intDecimal(18, 9)Comment
123123.00000000
2147483647NULL溢出

From float/double

支持四舍五入。

严格模式

如果源类型是nullable,返回nullable类型。

如果源类型是非nullable,返回非nullable类型。

  • Infinity和NaN报错。

  • 溢出时报错。

例子

float/doubleDecimal(18, 3)Comment
1.12391.124四舍五入
3.40282e+38报错溢出
Infinity报错
NaN报错

非严格模式

始终返回nullable类型。

  • +/-Inf转成NULL;

  • NaN转成NULL;

  • 溢出时转成NULL。

例子

float/doubleDecimal(18, 6)Comment
1.1234561.123456
3.40282e+38NULL溢出
InfinityNULL
NaNNULL

Cast between decimals

支持四舍五入。

严格模式

溢出报错。

如果源类型是nullable,返回nullable类型。

如果源类型是非nullable,返回非nullable类型。

例子

Decimal(18, 8)Decimal(10, 6)Comment
1234.123456781234.123457四舍五入
12345.12345678报错整数部分溢出

非严格模式

溢出转成NULL值。

如果源类型是nullable,返回nullable类型。

如果源类型是非nullable:

  • 如果可能溢出(比如cast decimal(18, 0) as decimal(9, 0)),返回nullable类型;

  • 否则返回非nullable类型(比如cast decimal(9, 0) as decimal(18, 0))。

例子

Decimal(18, 8)Decimal(10, 6)Comment
1234.123456781234.123457四舍五入
12345.12345678NULL整数部分溢出

From date

不支持。

From datetime

不支持。

From time

不支持。

From其它类型

不支持