第四十六章 Caché 函数大全 $NUMBER 函数

2020-10-06  本文已影响0人  Cache技术分享

第四十六章 Caché 函数大全 $NUMBER 函数

验证并返回一个数值; (可选)提供舍入和范围检查。

大纲

$NUMBER(num,format,min,max)
$NUM(num,format,min,max)

参数

描述

$NUMBER函数使用指定的格式转换并验证num数值。它接受以各种标点符号格式提供的数字,并以Caché规范形式返回数字。可以使用格式来测试数字是否为整数。如果指定了最小值或最大值,则数字必须在该值的范围内。.

$NUMBER可以用于美国格式编号,欧洲格式编号和俄语/捷克格式编号。

$DOUBLEINF-INFNAN上使用$NUMBER总是返回空字符串。

参数

format

可能的格式代码如下。这些格式代码可以以任何顺序指定。必须将非数字格式指定为带引号的字符串。以下任何或所有以下格式代码都可以省略。如果格式无效,则$NUMBER会生成<SYNTAX>错误。

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é规范格式数字。

  1. $NUMBER使用十进制字符格式来确定哪个字符是组分隔符,并去除所有组分隔符(无论它们在数字中的位置如何)。它使用以下规则:如果格式中指定的十进制字符为句点(),则组分隔符为逗号()或空格。如果格式中指定的十进制字符是逗号(),则组分隔符是句点()或空格。如果未以格式指定小数字符,则组分隔符是当前语言环境的NumericGroupSeparator属性。 (俄语(rusw),乌克兰语(ukrw)和捷克语(csyw)语言环境使用空格作为数字组分隔符。)
  2. $NUMBER验证数字是否格式正确。格式正确的数字可以包含以下任意一项:
  1. 如果整数指示符以格式显示,则$NUMBER检查整数。整数不能包含小数点指示符。数字字符串(“123.45”)和数字(123.45)的解析方式不同。即使十进制指示符后面没有数字,或者科学计数法或四舍五入的扩展将消除小数位,数字字符串也无法通过此整数测试。数字通过了这些验证测试。如果数字未通过整数指示符检查,则$NUMBER返回空字符串(“”)。
  2. $NUMBER将数字转换为Caché规范格式的数字。它扩展了科学计数法,用负号字符替换了括号,删除了前导和尾随的零,并删除了一个十进制指示符(如果后面没有任何非零数字)。
  3. $NUMBER使用舍入因子(如果存在)将数字舍入为指定的位数。然后,如果没有任何数字,它将去除所有前导或尾随零以及小数点指示符。
  4. $NUMBER根据指定的最小值验证数字。
  5. $NUMBER根据指定的最大值验证数字。
  6. $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é分数数字更精确。

上一篇下一篇

猜你喜欢

热点阅读