第四十六章 Caché 函数大全 $NUMBER 函数
验证并返回一个数值; (可选)提供舍入和范围检查。
大纲
$NUMBER(num,format,min,max)
$NUM(num,format,min,max)
参数
- num 要验证的数值,然后将其转换为Caché规范形式。它可以是数字或字符串值,变量名或任何有效的ObjectScript表达式。
- format 可选-指定要应用于num的处理选项。这些处理选项主要指示如何识别和处理包含小数点的数字。
- min 可选-可接受的最小数值。
- max 可选-可接受的最大数值。
描述
$NUMBER
函数使用指定的格式转换并验证num数值。它接受以各种标点符号格式提供的数字,并以Caché规范形式返回数字。可以使用格式来测试数字是否为整数。如果指定了最小值或最大值,则数字必须在该值的范围内。.
$NUMBER
可以用于美国格式编号,欧洲格式编号和俄语/捷克格式编号。
在$DOUBLE
值INF
,-INF
或NAN
上使用$NUMBER
总是返回空字符串。
参数
format
可能的格式代码如下。这些格式代码可以以任何顺序指定。必须将非数字格式指定为带引号的字符串。以下任何或所有以下格式代码都可以省略。如果格式无效,则$NUMBER
会生成<SYNTAX>
错误。
- 十进制字符:
“。”
或“,”
表示是否使用美国(“。”
)或欧洲(“,”
)惯例来验证小数点。可以指定这些字符,也可以不指定小数。如果省略小数字符,则数字采用当前语言环境的DecimalSeparator。 - 舍入系数:一个整数,指示要舍入的位数。该整数前面可以有一个可选的
+
或-
号。如果舍入因子为正(或无符号),则将数字舍入为指定的小数位数。如果舍入因子为0,则数字舍入为整数。如果舍入因子是负整数,则将数字舍入到小数点分隔符左侧的指定位数。例如,舍入因子-2
将234.45
舍入为200
。数字“ 5”
总是四舍五入;数字“5”
总是四舍五入。因此,舍入因子1
会将123.45
舍入为123.5
。 - 整数指示符:字母
“I”
(大写或小写),指定数字必须解析为整数。例如,–07.00
解析为整数,但–07.01
解析为整数。如果数字不能解析为整数,则$NUMBER
返回空字符串。在下面的示例中,仅前三个$NUMBER
函数返回一个整数。其他三个返回空字符串:
I
:参数可以判断是否为整数
/// d ##class(PHA.TEST.Function).NUMBER()
ClassMethod NUMBER()
{
WRITE $NUMBER(-07.00,"I")," non-canonical integer numeric",!
WRITE $NUMBER(+"-07.00","I")," string forced as integer numeric",!
WRITE $NUMBER("-7","I")," canonical integer string numeric",!
WRITE $NUMBER("-07.00","I")," non-canonical integer string numeric",!
WRITE $NUMBER(-07.01,"I")," fractional numeric",!
WRITE $NUMBER("-07.01","I")," fractional string numeric",!
}
DHC-APP>d ##class(PHA.TEST.Function).NUMBER()
-7 non-canonical integer numeric
-7 string forced as integer numeric
-7 canonical integer string numeric
non-canonical integer string numeric
fractional numeric
fractional string numeric
min and max
可以指定最小允许值,最大允许值,或两者都不指定。如果指定,则num值(四舍五入后)必须大于或等于最小值,并且小于或等于最大值。空字符串作为最小值或最大值等于零。如果值不满足这些条件,则$NUMBER
返回空字符串。
因此,在以下示例中,第一个有效,因为num(4.0
)等于max(4
)。第二个有效,因为num(4.003)在格式范围内(两个小数位数)仍等于max(4)。但是,第三个无效,因为$NUMBER
在格式范围内将num向上舍入为大于max的值(4.01)。它返回一个空字符串。
/// d ##class(PHA.TEST.Function).NUMBER1()
ClassMethod NUMBER1()
{
WRITE !,$NUMBER(4.0,2,0,4)
WRITE !,$NUMBER(4.003,2,0,4)
WRITE !,$NUMBER(4.006,2,0,4)
}
DHC-APP>d ##class(PHA.TEST.Function).NUMBER1()
4
4
可以省略参数,将逗号保留为占位符。以下示例的第一行设置最大值,但不设置格式或最小值。第二行没有设置格式值,但是设置了空字符串的最小值,它等于零。因此,第一行返回–7,第二行不符合最小条件,并返回空字符串。
/// d ##class(PHA.TEST.Function).NUMBER2()
ClassMethod NUMBER2()
{
SET max=10
WRITE !,$NUMBER(-7,,,max)
WRITE !,$NUMBER(-7,,"",max)
}
DHC-APP>d ##class(PHA.TEST.Function).NUMBER2()
-7
不能指定结尾的逗号。以下结果导致错误:
DHC-APP> WRITE $NUMBER(mynum,,min,)
WRITE $NUMBER(mynum,,min,)
^
<SYNTAX>
注意
操作顺序
$NUMBER
执行以下一系列转换和验证。如果该数字未通过任何验证步骤,则$NUMBER
返回空字符串(“”
)。如果该数字通过所有验证步骤,则$NUMBER
将返回转换后的Caché规范格式数字。
-
$NUMBER
使用十进制字符格式来确定哪个字符是组分隔符,并去除所有组分隔符(无论它们在数字中的位置如何)。它使用以下规则:如果格式中指定的十进制字符为句点(。
),则组分隔符为逗号(,
)或空格。如果格式中指定的十进制字符是逗号(,
),则组分隔符是句点(。
)或空格。如果未以格式指定小数字符,则组分隔符是当前语言环境的NumericGroupSeparator属性。 (俄语(rusw),乌克兰语(ukrw)和捷克语(csyw)语言环境使用空格作为数字组分隔符。) -
$NUMBER
验证数字是否格式正确。格式正确的数字可以包含以下任意一项:
- 数字
- 如上定义的可选十进制指示符(一个或一个,但不超过一个)。
- 可选的加号(
+
)或减号(-
)(前导或结尾,但不能超过一个)。 - 可选括号括住数字以指示负值。括号中的数字不能带有符号字符。
- 可选的以10为底的指数,由
“E”
(大写或小写)后跟一个整数表示。如果指定“E”
,则必须存在一个指数整数。指数整数之前可以带有符号字符。
- 如果整数指示符以格式显示,则
$NUMBER
检查整数。整数不能包含小数点指示符。数字字符串(“123.45”
)和数字(123.45
)的解析方式不同。即使十进制指示符后面没有数字,或者科学计数法或四舍五入的扩展将消除小数位,数字字符串也无法通过此整数测试。数字通过了这些验证测试。如果数字未通过整数指示符检查,则$NUMBER
返回空字符串(“”
)。 -
$NUMBER
将数字转换为Caché规范格式的数字。它扩展了科学计数法,用负号字符替换了括号,删除了前导和尾随的零,并删除了一个十进制指示符(如果后面没有任何非零数字)。 -
$NUMBER
使用舍入因子(如果存在)将数字舍入为指定的位数。然后,如果没有任何数字,它将去除所有前导或尾随零以及小数点指示符。 -
$NUMBER
根据指定的最小值验证数字。 -
$NUMBER
根据指定的最大值验证数字。 -
$NUMBER
返回结果数。
欧美十进制分隔符
$NUMBER
以规范形式返回数字,删除所有数字组分隔符,并最多包含一个小数分隔符。您可以使用格式值“,
”或“。
”标识num中使用的小数点分隔符;通过指定小数点分隔符,还隐式指定了数字组分隔符。
若要确定您的语言环境的DecimalSeparator字符,请调用以下方法:
DHC-APP>WRITE ##class(%SYS.NLS.Format).GetFormatItem("DecimalSeparator")
.
若要确定语言环境的NumericGroupSeparator字符和NumericGroupSize号,请调用以下方法:
DHC-APP> WRITE ##class(%SYS.NLS.Format).GetFormatItem("NumericGroupSeparator")
,
DHC-APP>WRITE ##class(%SYS.NLS.Format).GetFormatItem("NumericGroupSize")
3
在以下示例中,将逗号指定为小数点分隔符:
/// d ##class(PHA.TEST.Function).NUMBER3()
ClassMethod NUMBER3()
{
SET num="123,456"
WRITE !,$NUMBER(num,",")
// 转换为分数“ 123.456”
// (逗号被标识为小数点分隔符)
SET num="123,45,6"
WRITE !,$NUMBER(num,",")
// 返回空字符串
// (无效的数字,小数点分隔符过多)
SET num="123.456"
WRITE !,$NUMBER(num,",")
// 转换为整数“ 123456”
// 删除组分隔符
// (如果逗号为小数,则句点为组分隔符)
SET num="123.4.56.78"
WRITE !,$NUMBER(num,",")
// 转换为整数“ 123456”
// 删除组分隔符
// (组分隔符的数量和位置被忽略)
}
DHC-APP>d ##class(PHA.TEST.Function).NUMBER3()
123.456
123456
12345678
舍入和精度
四舍五入数字时,请注意IEEE浮点数和标准Caché分数数字的精度不同。 $DOUBLE
IEEE浮点数使用二进制表示法编码。它们的精度为53个二进制位,对应于精度为15.95的十进制数字。 (请注意,二进制表示形式并不完全对应于十进制小数。)由于大多数十进制分数不能完全以该二进制表示法来表示,因此IEEE浮点数可能与相应的标准Caché浮点数略有不同。在所有受支持的Caché系统平台上,标准Caché小数数字的精度为18个十进制数字。当IEEE浮点数显示为小数时,二进制位通常会转换为具有远远超过18个十进制数字的小数。这并不意味着IEEE浮点数比标准Caché分数数字更精确。