美文网首页
第二十二章 Caché 函数大全 $ISVALIDDOUBLE

第二十二章 Caché 函数大全 $ISVALIDDOUBLE

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

    第二十二章 Caché 函数大全 $ISVALIDDOUBLE 函数

    验证$DOUBLE数值并返回布尔值; (可选)提供范围检查。

    大纲

    $ISVALIDDOUBLE(num,scale,min,max)
    

    参数

    • num 要验证的数值。它可以是数字或字符串值,变量名或任何有效的CachéObjectScript表达式。如果有效数字,则将num转换为IEEE双精度浮点类型。
    • scale 可选-最小和最大范围比较的有效小数位数。
    • min 可选-允许的最小数值。提供的值将转换为IEEE双精度浮点类型。如果未指定,则min默认为$DOUBLE(“-INF”)
    • max 可选-允许的最大数值。提供的值将转换为IEEE双精度浮点类型。如果未指定,则max默认为$DOUBLE(“ INF”)

    描述

    $ISVALIDDOUBLE函数确定num是否通过对IEEE双精度浮点数的验证测试并返回布尔值。它可以选择使用最小值和最大值执行范围检查,这些值会自动转换为IEEE数字。在范围检查期间,使用scale参数来指定要比较的小数位数。布尔值1表示num是格式正确的IEEE双精度数值,并且如果指定了数值,则通过范围检查。$ISVALIDDOUBLE是一个验证函数;它不能确定num是不是数据类型为DOUBLE的数字,还是使用$DOUBLE函数生成的。

    $ISVALIDDOUBLE验证美国格式的数字,该数字使用句点()作为十进制分隔符。它不会验证使用逗号()作为小数点分隔符的欧洲格式编号。$ISVALIDDOUBLE认为包含数字组分隔符的数字无效。对于任何包含逗号或空格的数字,无论当前语言环境如何,它都将返回0(无效)。

    参数

    num

    要验证的数字可以是整数,小数,科学计数形式的数字(带有字母“E”或“e”)。它可以是字符串,表达式或可解析为数字的变量。它可以是有符号的或无符号的,并且可以包含前导零或尾随零。

    在将数字提供给$ISVALIDDOUBLE进行验证之前,ObjectScript会将数字转换为规范形式。因此,在通过函数求值之前,将解析所有算术表达式,数字级联或多个前导+符号。在评估之前,ObjectScript不会将数字字符串转换为规范形式。但是,在数字字符串前加上+号会强制对数字字符串进行数字计算(并因此进行规范转换)。

    如果发生以下情况,验证将失败($ISVALIDDOUBLE返回0)。

    • num包含数字0–9,前导+,小数点()和字母“E”“e”以外的任何字符。
    • num包含多个+符号,小数点或字母“E”“e”。如果num是一个数字,则ObjectScript解析多个前导+符号。如果num是数字字符串,则不能包含多个前导+符号。
    • 可选的+符号不是num的第一个字符。
    • 表示以10为底的指数的字母“E”“e”后跟数字字符串中的整数。如果使用数字,则“E”后没有整数会导致错误。
    • num是空字符串。

    如果num是INF(带有或不带有+或–符号),则它是有效的$DOUBLE数字; $ISVALIDDOUBLE返回的布尔值取决于num是否通过指定的范围检查。

    如果num是NAN $ISVALIDDOUBLE,则返回1。

    scale

    在范围检查期间,使用scale参数来指定要比较的小数位数。指定比例的整数值;标度值中的任何小数位数都会被忽略。可以指定一个大于其他参数中指定的小数位数的小数位值。可以将刻度值指定为–1;所有其他负比例值会导致<FUNCTION>错误。

    非负小数位值会使num在执行最小和最大范围检查之前四舍五入到小数位数。小数位数为0会使num在执行范围检查之前四舍五入为整数值(3.9 = 4)。标度值–1导致num在执行范围检查之前被截断为整数值(3.9 = 3)。要比较所有指定的数字而不舍入或截断,请省略scale参数。非数字或空字符串的小数位值等于小数位值0。

    对除–1以外的所有比例值进行舍入。值始终大于或等于5。

    标度参数值使用num值的四舍五入或截尾形式进行计算。 $ISVALIDDOUBLE处理不会更改num变量的实际值。

    如果省略了scale参数,请保留逗号作为占位符。

    min and max

    可以指定最小允许值,最大允许值,或两者都不指定。如果指定,num值(在缩放操作之后)必须大于或等于最小值,并且小于或等于最大值。将该值转换为IEEE浮点数,然后再用于范围检查。空字符串作为最小值或最大值等于零。如果值不满足这些条件,则$ISVALIDDOUBLE将返回0。

    NAN值始终有效,无论最小值或最大值。

    如果省略参数,请保留逗号作为占位符。例如,当省略比例并指定min或max时,或在省略min并指定max时。尾部逗号将被忽略。

    示例

    在以下示例中,每次调用$ISVALIDDOUBLE均返回1(有效数字):

    /// d ##class(PHA.TEST.Function).ISVALIDDOUBLE()
    ClassMethod ISVALIDDOUBLE()
    {
        WRITE !,$ISVALIDDOUBLE(0)        ; 所有整数 OK
        WRITE !,$ISVALIDDOUBLE(4.567)    ; 小数 OK
        WRITE !,$ISVALIDDOUBLE("4.567")  ; 数字字符串 OK
        WRITE !,$ISVALIDDOUBLE(-.0)      ; 符号数字 OK
        WRITE !,$ISVALIDDOUBLE(-+--123)  ; 多个符号解析为数字 OK
        WRITE !,$ISVALIDDOUBLE(+004.500) ; 前导/尾随零 OK
        WRITE !,$ISVALIDDOUBLE(4E2)      ; 科学技术 OK
    }
    
    
    DHC-APP>d ##class(PHA.TEST.Function).ISVALIDDOUBLE()
     
    1
    1
    1
    1
    1
    1
    1
    

    在以下示例中,每次调用$ISVALIDDOUBLE均返回0(无效数字):

    /// d ##class(PHA.TEST.Function).ISVALIDDOUBLE1()
    ClassMethod ISVALIDDOUBLE1()
    {
        WRITE !,$ISVALIDDOUBLE("")        ; 空字符串无效
        WRITE !,$ISVALIDDOUBLE("4,567")   ; 不允许使用逗号
        WRITE !,$ISVALIDDOUBLE("4A")      ; 无效字符
        WRITE !,$ISVALIDDOUBLE("-+--123") ; 无法解析字符串的多个符号
    }
    
    DHC-APP>d ##class(PHA.TEST.Function).ISVALIDDOUBLE1()
     
    0
    0
    0
    0
    

    在下面的示例中,严格来说,即使INF(无穷大)和NAN(非数字)不是数字,每次调用$ISVALIDDOUBLE都会返回1(有效数字):

    /// d ##class(PHA.TEST.Function).ISVALIDDOUBLE2()
    ClassMethod ISVALIDDOUBLE2()
    {
        WRITE !,$ISVALIDDOUBLE($DOUBLE($ZPI))  ; DOUBLE 数字 OK
        WRITE !,$ISVALIDDOUBLE($DOUBLE("INF")) ; DOUBLE INF OK
        WRITE !,$ISVALIDDOUBLE($DOUBLE("NAN")) ; DOUBLE NAN OK
    }
    
    DHC-APP>d ##class(PHA.TEST.Function).ISVALIDDOUBLE2()
     
    1
    1
    1
    

    在以下示例中,指定最小值将消除-INF而不消除INF

    /// d ##class(PHA.TEST.Function).ISVALIDDOUBLE3()
    ClassMethod ISVALIDDOUBLE3()
    {
       WRITE !,$ISVALIDDOUBLE($DOUBLE("-INF"),,99999999999)
       WRITE !,$ISVALIDDOUBLE($DOUBLE("INF"),,99999999999)
    }
    
    DHC-APP>d ##class(PHA.TEST.Function).ISVALIDDOUBLE3()
     
    0
    1
    

    以下示例显示了min和max参数的用法。以下所有结果均返回1(数字有效,并且还通过范围检查):

    /// d ##class(PHA.TEST.Function).ISVALIDDOUBLE4()
    ClassMethod ISVALIDDOUBLE4()
    {
        WRITE !,$ISVALIDDOUBLE(4,,3,5)          ; 可以省略范围
        WRITE !,$ISVALIDDOUBLE(4,2,3,5)         ; 可以大于小数位数       
        WRITE !,$ISVALIDDOUBLE(4,0,,5)          ; 最小值或最大值可以省略
        WRITE !,$ISVALIDDOUBLE(4,0,4,4)         ; 最小值和最大值(含)
        WRITE !,$ISVALIDDOUBLE(-4,0,-5,5)       ; 负数
        WRITE !,$ISVALIDDOUBLE(4.00,2,04,05)    ; 前导/尾随零
        WRITE !,$ISVALIDDOUBLE(.4E3,0,3E2,400)  ; 以10为底的指数扩展
    }
    
    DHC-APP>d ##class(PHA.TEST.Function).ISVALIDDOUBLE4()
     
    1
    1
    1
    1
    1
    1
    1
    

    以下示例显示了使用scale参数的min和max的情况。以下所有值均返回1(数字有效且还通过范围检查):

    /// d ##class(PHA.TEST.Function).ISVALIDDOUBLE5()
    ClassMethod ISVALIDDOUBLE5()
    {
       WRITE !,$ISVALIDDOUBLE(4.55,,4.54,4.551)
         ; 省略小数位时,将检查num的所有数字。
       WRITE !,$ISVALIDDOUBLE(4.1,0,4,4.01)
         ; 当scale = 0时,num在最小值和最大值检查之前四舍五入为整数值(0个小数位)。
       WRITE !,$ISVALIDDOUBLE(3.85,1,3.9,5)
         ; Num四舍五入为1个小数位数(值向上舍入为5或更大);在进行最小检查之前。
       WRITE !,$ISVALIDDOUBLE(4.01,17,3,5) 
         ; 小数位数可以大于数字位数。
       WRITE !,$ISVALIDDOUBLE(3.9,-1,2,3)
         ; 当scale = -1时,num被截断为整数值
    }
    
    DHC-APP>d ##class(PHA.TEST.Function).ISVALIDDOUBLE5()
     
    1
    1
    1
    1
    1
    

    注意

    $ISVALIDDOUBLE$ISVALIDNUM比较

    $ISVALIDDOUBLE$ISVALIDNUM函数都验证美国格式的数字并返回布尔值(0或1)。

    • 这两个函数都接受$DOUBLE返回的INF-INFNaN值作为有效数字。$ISVALIDDOUBLE还接受不区分大小写的字符串“NaN”“INF”、变体“Infinity”“snan”以及任何以单个加号或减号开头的字符串作为有效数字。$ISVALIDNUM以无效为由拒绝所有这些字符串,并返回0。
    /// d ##class(PHA.TEST.Function).ISVALIDDOUBLE6()
    ClassMethod ISVALIDDOUBLE6()
    {
        WRITE !,$ISVALIDNUM($DOUBLE("NAN"))    ; returns 1
        WRITE !,$ISVALIDDOUBLE($DOUBLE("NAN")) ; returns 1
        WRITE !,$ISVALIDNUM("NAN")             ; returns 0
        WRITE !,$ISVALIDDOUBLE("NAN")          ; returns 1
    }
    
    • 这两个函数都解析有符号和无符号整数(包括-0)、科学记数法数字(带有“E”“e”)、实数(123.45)和数字字符串(“123.45”)。将所有这些字符串视为无效,并返回0。
    • 这两个函数都不识别欧洲小数分隔符字符(逗号())或NumericGroupSeparator字符(美式格式:逗号();欧式格式:句点(.))。例如,无论当前的区域设置如何,两者都会将字符串“123,456”作为无效数字拒绝。
    • 这两个函数都解析数字的多个前导符号(+-)。两者都不接受带引号的数字字符串中的多个前导符号。
    DHC-APP>w $ISVALIDDOUBLE("0")
    1
    DHC-APP>w $ISVALIDDOUBLE("+0")
    1
    DHC-APP>w $ISVALIDDOUBLE("++0")
    0
    

    相关文章

      网友评论

          本文标题:第二十二章 Caché 函数大全 $ISVALIDDOUBLE

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