美文网首页
第四十六章 Caché 函数大全 $NUMBER 函数

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

作者: Cache技术分享 | 来源:发表于2020-10-06 09:41 被阅读0次

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

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

    大纲

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

    参数

    • num 要验证的数值,然后将其转换为Caché规范形式。它可以是数字或字符串值,变量名或任何有效的ObjectScript表达式。
    • format 可选-指定要应用于num的处理选项。这些处理选项主要指示如何识别和处理包含小数点的数字。
    • min 可选-可接受的最小数值。
    • max 可选-可接受的最大数值。

    描述

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

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

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

    参数

    format

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

    • 十进制字符:“。”“,”表示是否使用美国(“。”)或欧洲(“,”)惯例来验证小数点。可以指定这些字符,也可以不指定小数。如果省略小数字符,则数字采用当前语言环境的DecimalSeparator。
    • 舍入系数:一个整数,指示要舍入的位数。该整数前面可以有一个可选的+-号。如果舍入因子为正(或无符号),则将数字舍入为指定的小数位数。如果舍入因子为0,则数字舍入为整数。如果舍入因子是负整数,则将数字舍入到小数点分隔符左侧的指定位数。例如,舍入因子-2234.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é规范格式数字。

    1. $NUMBER使用十进制字符格式来确定哪个字符是组分隔符,并去除所有组分隔符(无论它们在数字中的位置如何)。它使用以下规则:如果格式中指定的十进制字符为句点(),则组分隔符为逗号()或空格。如果格式中指定的十进制字符是逗号(),则组分隔符是句点()或空格。如果未以格式指定小数字符,则组分隔符是当前语言环境的NumericGroupSeparator属性。 (俄语(rusw),乌克兰语(ukrw)和捷克语(csyw)语言环境使用空格作为数字组分隔符。)
    2. $NUMBER验证数字是否格式正确。格式正确的数字可以包含以下任意一项:
    • 数字
    • 如上定义的可选十进制指示符(一个或一个,但不超过一个)。
    • 可选的加号(+)或减号(-)(前导或结尾,但不能超过一个)。
    • 可选括号括住数字以指示负值。括号中的数字不能带有符号字符。
    • 可选的以10为底的指数,由“E”(大写或小写)后跟一个整数表示。如果指定“E”,则必须存在一个指数整数。指数整数之前可以带有符号字符。
    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é分数数字更精确。

    相关文章

      网友评论

          本文标题:第四十六章 Caché 函数大全 $NUMBER 函数

          本文链接:https://www.haomeiwen.com/subject/kezzuktx.html