第二十章 Caché 函数大全 $INUMBER 函数
验证数字值并将其转换为内部格式。
大纲
$INUMBER(fnumber,format,erropt)
$IN(fnumber,format,erropt)
参数
- fnumber 要转换为内部格式的数值。它可以是数字或字符串值,变量名或任何有效的CachéObjectScript表达式。
- format 格式规范,指示哪些外部数字格式是数字的有效表示形式。指定为带引号的字符串,该字符串由零个或多个格式代码组成(以任意顺序)。格式代码如下所述。请注意,某些格式代码不兼容并导致错误。对于默认格式,无论是否带有erropt参数,都可以指定空字符串(
“”
)。 - erropt 可选-如果根据格式认为fnumber无效,则返回表达式。
描述
$INUMBER
函数使用格式指定的格式来验证数值fnumber。然后将其转换为内部Caché格式。
如果fnumber与指定的格式不对应,并且未指定erropt,则Caché会生成<ILLEGAL VALUE>
错误。如果指定了erropt,则无效的数值将返回erropt字符串。
参数
format
可能的格式代码如下。可以单独指定或组合指定它们,以指示$iNumber
严格遵守格式规则。如果未输入格式代码,$iNumber
将在验证fnumber时尽可能灵活
代码 | 描述 |
---|---|
+ |
强制性标志。 fnumber值必须有一个明确的符号。即使数字0也必须签名(+0或-0)。除非受“L ”或“T ”格式代码的限制,否则该符号可以是开头或结尾。不能使用括号。唯一不需要符号的值是NAN ,使用代码“D + ”时可以指定带或不带符号。 |
- |
未签名。 fnumber中可能没有符号。 |
D |
$DOUBLE 数字。此代码将数字转换为IEEE浮点数。这等效于$DOUBLE(fnumber) 。 如果指定“D” ,则可以输入带引号的字符串“INF” 和“ NAN” 作为fnumber值。INF 和NAN 可以以大小写字母的任意组合指定,带有或不带有前导或尾随符号或括号。(对于NAN ,可接受但忽略符号。)还支持变体形式INFINITY 和SNAN 。 |
E 或 G |
电子记数法(科学记数法)。此代码允许将fnumber指定为科学记数法格式的字符串。此代码允许(但不要求)使用科学记数法指定fnumber。 |
N |
没有NumericGroupSeparator 。不允许使用数字组分隔符。此格式代码与逗号(, )格式代码不兼容。 |
O |
ODBC区域设置。覆盖当前区域设置,而使用具有下列值的标准ODBC区域设置:PlusSign=+;MinusSign=-;DecimalSeparator=.;NumericGroupSeparator=,;NumericGroupSize=3 。此格式代码与点(. )不兼容。格式化代码。 |
P |
负数必须用括号括起来。非负数必须是无符号的,并且可以包含或省略前导空格和尾随空格。 |
L |
先导标志。符号(如果存在)必须在fnumber的数字部分之前。不允许使用括号。 |
T |
尾部标志。符号(如果有)必须跟在fnumber的数字部分之后。不允许使用括号。 |
, |
期望fnumber使用当前语言环境中的属性指定的格式。 NumericGroupSeparator (默认情况下为“, ”)可能会出现也可能不会出现在fnumber中,但如果存在,它必须始终出现在小数点左边的每个NumericGroupSize (默认情况下为3)位。 |
. |
无论当前的区域设置如何,都需要标准的欧洲格式。要求将DecimalSeparator 作为逗号(, ),将NumericGroupSeparator 作为句点(. ),将NumericGroupSize 作为3,将PlusSign 作为加号(+ ),将MinusSign 作为减号(- )。句点是可选的,但如果存在,则必须始终每三位出现在小数点逗号左侧。 |
当没有“+”、“-”和“P”格式代码时
如果FORMAT不包括任何“+”、“-”或“P”
代码,则fnumber可以包含以下任一代码:
- 没有符号或括号。
PlusSign
区域设置属性(默认为“+”
)或MinusSign
区域设置属性(默认为“-”
),但不能同时使用这两个属性。此标志的位置由“L”
或“T”
格式代码(如果指定)确定。- 前导括号和尾随括号。
当没有“L”、“T”和“P”格式代码时
当FORMAT
不包括任何“L”、“T”或“P”
格式代码时,fnumber中出现的任何符号可以是前导或尾随(但不能同时为两者)。
何时“、”和“。”缺少格式代码
当格式既不包括“,”
也不包括“”
时。"。
"格式代码,fnumber可以选择让NumericGroupSeparator
符号出现在DecimalSeparator
(如果有的话)左侧或右侧的任何位置。但是,每个NumericGroupSeparator
的左边和右边都必须至少有一个数字。当FORMAT
包含“N”
时,不允许使用NumericGroupSeparator
符号。
互斥格式代码
某些格式代码相互冲突。以下格式代码对中的每一对都是互斥的,并会导致错误:
“-+”
导致<FUNCTION>
错误“ -P”或“ + P”
导致<SYNTAX>
错误“ TP”或“ LP”
导致<SYNTAX>
错误“ TL”
导致<FUNCTION>
错误“、。”
导致<FUNCTION>
错误“,N”
导致<FUNCTION>
错误“.o”
导致<FUNCTION>
错误
如果指定无效的格式代码字符,也会生成<FUNCTION>
错误。
NULL格式提供了最大的灵活性
可以将格式指定为空字符串。这称为空格式。指定空格式时,$INUMBER
接受具有以下符号约定中的任何一种的fnumber值:
- 没有符号或括号。
- 前导或尾随的
MinusSign
,但不能同时使用。 - 前导加号或尾随加号,但不能同时使用。
- 前导括号和尾随括号。
如果指定了null格式,则fnumber可以选择使NumericGroupSeparator
符号出现在DecimalSeparator
左侧或右侧的任何位置(如果有)。但是,每个NumericGroupSeparator
的左端必须至少有一个数字,而其右端必须至少有一个数字。签名规则很灵活,前导空格和尾随空格和零都将被忽略。因此,以下两个命令:
DHC-APP>WRITE !,$INUMBER("+1,23,456,7.8,9,100","")
1234567.891
DHC-APP> WRITE !,$INUMBER("0012,3456,7.891+","")
1234567.891
都有效,并且返回相同的数字,并根据默认语言环境设置格式。然而,
DHC-APP>WRITE $INUMBER("1,23,,345,7.,8,9,","")
WRITE $INUMBER("1,23,,345,7.,8,9,","")
^
<ILLEGAL VALUE>
由于相邻的逗号,相邻的句点和逗号以及结尾的逗号而无效。它生成一个错误。
所有格式的共同行为
不管指定的格式代码如何,$INUMBER
始终忽略开头和结尾的空格或零,但是如果fnumber具有以下任何特征,则认为fnumber无效:
- 加号和减号都有
- 多个加号或减号
- 括号和加号
- 括号和减号
- 多个小数分隔符
- 嵌入空格
- 以下字符以外的任何字符:
- 数字位数
“(“
“)”
- 前导空格或尾随空格
- 由当前区域设置指定的
DecimalSeparator
(如果格式不包括“.”
) - 当前语言环境指定的
NumericGroupSeparator
(如果格式不包含“。”
) - 当前语言环境指定的
PlusSign
属性(如果格式不包含“。”
) - 当前语言环境指定的
MinusSign
属性(如果格式不包含“。”
) “.”
(如果格式包括“.”
)“,”
(如果格式包括“.”
)“+”
(如果格式包括“.”
)“-”
(如果格式包括“ .”
)
- 如果格式包括
“D”
,则字符串“INF”
和“NAN”
(及其变体)。
示例
这些示例说明了不同的格式如何影响$INUMBER
的行为。所有这些示例均假定当前语言环境为默认语言环境。
在下面的示例中,$INUMBER
由于使用“L”
格式代码而接受一个减号,并返回-123456789.12345678
:
DHC-APP>WRITE $INUMBER("-123,4,56,789.1234,5678","L")
-123456789.12345678
在以下示例中,$INUMBER
生成一个错误,因为该符号在前,但是“T”
格式代码指定必须使用结尾的符号:
DHC-APP>WRITE $INUMBER("-123,4,56,789.1234,5678","T")
WRITE $INUMBER("-123,4,56,789.1234,5678","T")
^
<ILLEGAL VALUE>
DHC-APP>WRITE $INUMBER("123,4,56,789.1234,5678+","T")
123456789.12345678
DHC-APP>WRITE $INUMBER("123,4,56,789.1234,5678-","T")
-123456789.12345678
在下面的示例中,第一个$INUMBER
成功并返回负数。第二个$INUMBER
生成一个错误,因为fnumber包含一个符号,但是“P”
格式代码指定负数必须用括号括起来而不是带符号:
DHC-APP>WRITE !,$INUMBER("(123,4,56,789.1234,5678)","P")
-123456789.12345678
DHC-APP>WRITE !,$INUMBER("-123,4,56,789.1234,5678","P")
WRITE !,$INUMBER("-123,4,56,789.1234,5678","P")
^
<ILLEGAL VALUE>
在下面的示例中,$INUMBER
生成错误,因为存在符号,但是“-”
格式代码指定数字必须为无符号:
DHC-APP>WRITE $INUMBER("-123,4,56,789.1234,5678","-")
WRITE $INUMBER("-123,4,56,789.1234,5678","-")
^
<ILLEGAL VALUE>
DHC-APP>WRITE $INUMBER("123,4,56,789.1234,5678","-")
123456789.12345678
在以下示例中,$INUMBER
失败,但由于非法使用符号而不会产生错误,而是返回指定为错误的字符串“ERR”
作为其值:
DHC-APP>WRITE $INUMBER("-123,4,56,789.1234,5678","-","ERR")
ERR
以下示例返回-23456789.123456789
; $INUMBER
将指定的fnumber视为有效,因为前导符号遵循“L”
指定的格式,并且小数点左边每三位数的逗号严格间隔,其右无逗号遵循 “,”指定的严格格式”代码:
DHC-APP> WRITE $INUMBER("-23,456,789.123456789","L,")
-23456789.123456789
在以下示例中,“E”
代码允许将科学符号字符串转换为数字。请注意,所有格式代码都支持科学记数法作为数字文字,但是只有“E”
(或“G”
)支持科学记数法作为字符串。本示例使用变量和串联来提供科学计数字符串值:
DHC-APP>SET num=1.234
DHC-APP>SET exp=-14
DHC-APP>WRITE $INUMBER(1.234E-14,"E","E-lit-err"),!
.00000000000001234
DHC-APP>WRITE $INUMBER(num_"E"_exp,"E","E-string-err"),!
.00000000000001234
DHC-APP>WRITE $INUMBER(1.234E-14,"L","L-lit-err"),!
.00000000000001234
DHC-APP>WRITE $INUMBER(num_"E"_exp,"L","L-string-err"),!
L-string-err
下面的示例比较“L”
代码和“D”
代码返回的值的分数和常数pi
。 “D”
代码转换为IEEE浮点数($DOUBLE
):
DHC-APP>WRITE $INUMBER(1.23E-23,"L"),!
.0000000000000000000000123
DHC-APP>WRITE $INUMBER(1.23E-23,"D"),!
.000000000000000000000012299999999999999704
DHC-APP>WRITE $INUMBER($ZPI,"L"),!
3.141592653589793238
DHC-APP>WRITE $INUMBER($ZPI,"D"),!
3.1415926535897931159
注意
$NUMBER
和$FNUMBER
之间的差异
大多数格式代码在$INUMBER
和$FNUMBER
函数中具有相似的含义,但是由于执行的验证和转换的性质,每个代码触发的确切行为因函数而异。
特别是,“-”
和“+”
格式代码对$INUMBER
的含义与对$FNUMBER
的含义完全不同。对于$FNUMBER
,“-”
和“+”
不互斥,“-”
仅影响MinusSign
(通过抑制它),而“+”
仅影响PlusSign
(通过插入它)。对于$INUMBER
,“-”
和“+”
是互斥的。 “-”
表示不允许使用符号,“+”
表示必须使用符号。
小数点分隔符
$INUMBER
使用当前区域设置(“.”
)的DecimalSeparator
属性值。默认情况下)作为fnumber的整数部分和小数部分之间的分隔符。当“。”
如果指定了格式代码,则此分隔符为“,”
,而与当前区域设置无关。
若要确定区域设置的DecimalSeparator
字符,请调用GetFormatItem()
方法:
DHC-APP> WRITE ##class(%SYS.NLS.Format).GetFormatItem("DecimalSeparator")
.
数字分组分隔符和大小
$INUMBER
使用当前区域设置中的NumericGroupSeparator
属性值(默认情况下“,”
)作为fnumber整数部分中数字组之间的分隔符。这些组的大小由当前区域设置的NumericGroupSize
属性(默认情况下为“3”
)确定。当“。”
指定了格式码,则此分隔符为“。并且每三位数显示一次,与当前区域设置无关。
要确定区域设置的NumericGroupSeparator
字符和NumericGroupSize
编号,请调用GetFormatItem()
方法:
DHC-APP>WRITE ##class(%SYS.NLS.Format).GetFormatItem("NumericGroupSeparator"),!
,
DHC-APP> WRITE ##class(%SYS.NLS.Format).GetFormatItem("NumericGroupSize")
3
加号和减号
$iNumber
使用当前区域设置中的PlusSign
和MinusSign
属性值(默认情况下为“+”
和“-”
)。当“。”
如果指定了格式代码,则无论当前区域设置如何,这些符号都将设置为“+”
和“-”
。
要确定的区域设置的PlusSign
和MinusSign
字符,请调用GetFormatItem()
方法:
DHC-APP> WRITE ##class(%SYS.NLS.Format).GetFormatItem("PlusSign"),!
+
DHC-APP>WRITE ##class(%SYS.NLS.Format).GetFormatItem("MinusSign")
-