第二十三章 Caché 函數大全 $ISVALIDNUM 函數 第二十三章 Caché 函數大全 $ISVALIDNUM 函數 大綱 描述 示例 注意

第二十三章 Caché 函數大全 $ISVALIDNUM 函數

驗證數值並返回布爾值;可選地提供範圍檢查。

大綱

$ISVALIDNUM(num,scale,min,max)

參數

  • num 要驗證的數值。它可以是數值或字符串值、變量名或任何有效的ObjectScript表達式。
  • scale 可選-最小和最大範圍比較的有效小數位數。
  • min 可選-允許的最小數值。
  • max 可選-允許的最大數值。

描述

num

要驗證的數字可以是整數、實數或科學記數法數字(帶有字母“E”“e”)。它可以是字符串、表達式或解析爲數字的變量。它可以是有符號的,也可以是無符號的,並且可以包含前導零或尾隨零。在以下情況下,驗證失敗($ISVALIDNUM返回0):

  • num是空字符串(“”)。
  • num包含數字0–9,前導+,小數點()和字母“E”“e”以外的任何字符。
  • num包含多個+符號,小數點或字母“E”“e”
  • 可選的+符號不是num的第一個字符。
  • 表示以10爲底的指數的字母“E”“e”後跟數字字符串中的整數。

$ISVALIDNUM以外,在任何表達式中指定非整數指數的10進制數都會導致錯誤。例如,寫7E3.5

Scale參數值使用數值的四捨五入或截斷版本進行求值。$ISVALIDNUM處理不會更改num變量的實際值。

如果num是$DOUBLE返回的INF-INFNAN值,則$ISVALIDNUM返回1。

Caché支持的最大浮點數是1.7976931348623157081E308。在任何Caché數值運算中指定較大的數字都會產生錯誤。指定爲$ISVALIDNUM支持的字符串的最大Caché十進制浮點數爲9.223372036854775807E145。對於大於此長度的浮點數字符串,請使用$ISVALIDDOUBLE

scale

Scale參數在範圍檢查期間用於指定要比較的小數位數。爲比例尺指定整數值;將忽略比例尺值中的小數位。可以指定大於其他參數中指定的小數位數的比例值。可以將比例值指定爲-1;所有其他負的比例值都會導致<function>錯誤。

非負範圍值會導致在執行最小和最大範圍檢查之前將num舍入爲該小數位數。刻度值爲0會導致在執行範圍檢查之前將num舍入爲整數值(3.9=4)。刻度值爲-1會導致在執行範圍檢查之前將num截斷爲整數值(3.9=3)。要比較所有指定的數字而不捨入或截斷,請省略Scale參數。非數字或空字符串的比例值等效於比例值0。

對除-1以外的所有比例值執行舍入。值爲5或更大時始終向上舍入。

如果省略Scale參數,請保留逗號作爲佔位符。

舍入數字時,請注意IEEE浮點數和Caché小數的精度不同。$DOUBLE IEEE浮點數使用二進制表示法進行編碼。它們的精度爲53個二進制位,相當於15.95個十進制數字的精度。(請注意,二進制表示法並不完全對應於十進制分數。)。由於大多數小數不能用此二進制記數法精確表示,因此IEEE浮點數可能與相應的Caché浮點數略有不同。在所有支持的Caché系統平臺上,Caché小數的精度爲18位小數。當IEEE浮點數顯示爲小數時,二進制位通常被轉換爲具有遠遠多於18個十進制位的小數。這並不意味着IEEE浮點數比,Caché小數更精確。

min and max

可以指定最小允許值、最大允許值、兩者都不指定或兩者都指定。如果指定,則Num值(在縮放操作之後)必須大於或等於最小值,且小於或等於最大值。作爲最小或最大值的空字符串等於零。如果值不滿足這些條件,$ISVALIDNUM將返回0。

如果省略參數,請保留逗號作爲佔位符。例如,當省略SCALE而指定MIN或MAX時,或者省略MIN並指定MAX時。尾隨逗號將被忽略。

如果NUM、MIN或MAX值是$DOUBLE數字,則對於此範圍檢查,所有這三個數字都被視爲$DOUBLE數字。這可以防止$DOUBLE數的小的生成小數部分導致意外的範圍錯誤。

示例

在以下示例中,每次調用$ISVALIDNUM都返回1(有效數字):

/// d ##class(PHA.TEST.Function).ISVALIDNUM()
ClassMethod ISVALIDNUM()
{
    WRITE !,$ISVALIDNUM(0)        ; 所有整數 OK
    WRITE !,$ISVALIDNUM(4.567)    ; 小數 OK
    WRITE !,$ISVALIDNUM("4.567")  ; 數字字符 OK
    WRITE !,$ISVALIDNUM(-.0)      ; 符號數字 OK
    WRITE !,$ISVALIDNUM(+004.500) ; 前導或尾隨0 OK
    WRITE !,$ISVALIDNUM(4E2)      ; 科學計數 OK
}

DHC-APP>d ##class(PHA.TEST.Function).ISVALIDNUM()
 
1
1
1
1
1
1

在以下示例中,每次調用$ISVALIDNUM都返回0(無效數字):

/// d ##class(PHA.TEST.Function).ISVALIDNUM1()
ClassMethod ISVALIDNUM1()
{
    WRITE !,$ISVALIDNUM("")      ; 空字符串無效
    WRITE !,$ISVALIDNUM("4,567") ; 逗號不允許
    WRITE !,$ISVALIDNUM("4A")    ; 無效字符
}
DHC-APP>d ##class(PHA.TEST.Function).ISVALIDNUM1()
 
0
0
0

在下面的示例中,每次調用$ISVALIDNUM都返回1(有效數字),即使INF(無窮大)和NaN(不是A數字)嚴格地說不是數字:

/// d ##class(PHA.TEST.Function).ISVALIDNUM2()
ClassMethod ISVALIDNUM2()
{
    DO ##class(%SYSTEM.Process).IEEEError(0)
    WRITE !,$ISVALIDNUM($DOUBLE($ZPI))  ; DOUBLE numbers OK
    WRITE !,$ISVALIDNUM($DOUBLE("INF")) ; DOUBLE INF OK
    WRITE !,$ISVALIDNUM($DOUBLE("NAN")) ; DOUBLE NAN OK
    WRITE !,$ISVALIDNUM($DOUBLE(1)/0)   ; generated INF OK
}

DHC-APP> d ##class(PHA.TEST.Function).ISVALIDNUM2()
 
1
1
1
1

以下示例顯示了min和max參數的使用。以下所有返回1(數字有效,也通過範圍檢查):

/// d ##class(PHA.TEST.Function).ISVALIDNUM3()
ClassMethod ISVALIDNUM3()
{
    WRITE !,$ISVALIDNUM(4,,3,5)    ; scale 可以忽略
    WRITE !,$ISVALIDNUM(4,2,3,5)   ; scale 可以大於整數位數
    WRITE !,$ISVALIDNUM(4,0,,5)    ; 最大最小值可以忽略
    WRITE !,$ISVALIDNUM(4,0,4,4)   ; 包含最大最小值
    WRITE !,$ISVALIDNUM(-4,0,-5,5) ; 負數
    WRITE !,$ISVALIDNUM(4.00,2,04,05) ; 前導或尾隨0 
    WRITE !,$ISVALIDNUM(.4E3,0,3E2,400) ; 以10爲底的指數擴展
}
DHC-APP>d ##class(PHA.TEST.Function).ISVALIDNUM3()
 
1
1
1
1
1
1
1

下面的示例顯示了Scale參數與min和max的使用。以下所有返回1(數字有效,也通過範圍檢查):

/// d ##class(PHA.TEST.Function).ISVALIDNUM4()
ClassMethod ISVALIDNUM4()
{
   WRITE !,$ISVALIDNUM(4.55,,4.54,4.551)
     ; 省略小數位時,將檢查num的所有數字。
   WRITE !,$ISVALIDNUM(4.1,0,4,4.01)
     ; 當scale = 0時,num在最小值和最大值檢查之前四捨五入爲整數值(0個小數位)。
   WRITE !,$ISVALIDNUM(3.85,1,3.9,5)
     ; Num四捨五入爲1個小數位數(值向上舍入爲5或更大);在進行最小檢查之前。
   WRITE !,$ISVALIDNUM(4.01,17,3,5) 
     ; 小數位數可以大於數字位數。
   WRITE !,$ISVALIDNUM(3.9,-1,2,3)
     ; 當scale = -1時,num被截斷爲整數值
}
DHC-APP>d ##class(PHA.TEST.Function).ISVALIDNUM4()
 
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”作爲無效數字拒絕。
  • 這兩個函數都解析數字的多個前導符號(+-)。兩者都不接受帶引號的數字字符串中的多個前導符號。

如果數字字符串太大,無法用Caché 浮點數表示,則默認情況下會自動將其轉換爲IEEE雙精度數字。但是,如此大的數字無法通過$ISVALIDNUM測試,如以下示例所示:

/// d ##class(PHA.TEST.Function).ISVALIDNUM5()
ClassMethod ISVALIDNUM5()
{
    WRITE !,"E127不需要IEEE轉換"
    WRITE !,$ISVALIDNUM("9223372036854775807E127")
    WRITE !,$ISVALIDDOUBLE("9223372036854775807E127")
    WRITE !,"E128自動IEEE轉換"
    WRITE !,$ISVALIDNUM("9223372036854775807E128")
    WRITE !,$ISVALIDDOUBLE("9223372036854775807E128")
}

$ISVALIDNUM$NORMALIZE$NUMBER比較

$ISVALIDNUM$NORMALIZE$NUMBER函數都驗證數字。$ISVALIDNUM返回布爾值(0或1)。$NORMALIZE$NUMBER返回指定數字的驗證版本。

DHC-APP>w $number("1.1",0)
1
DHC-APP>w $number("1.5",0)
2
DHC-APP>w $number("1.5",-1)
0

這三個函數提供不同的驗證標準。選擇最符合需要的。

  • 美式格式號碼通過所有三個函數進行驗證。歐洲格式的數字僅由$NUMBER函數驗證。
  • 這三個函數都解析有符號和無符號整數(包括-0)、科學記數法數字(帶有“E”“e”)以及帶小數部分的數字。但是,可以(使用“i”格式)將$number設置爲拒絕帶有小數部分的數字(包括具有負基10指數的科學記數法)。這三個函數同時解析數字(123.45)和數字字符串(“123.45”)。
  • 所有三個函數都會去掉前導零和尾隨零。除非後面跟一個非零值,否則會去掉小數字符。
  • DecimalSeparator$number驗證小數字符(美國格式:句點(.)。或歐洲格式:逗號())基於其格式參數(或當前區域設置的默認值)。其他函數只驗證美式格式的十進制數字,而不考慮當前的區域設置。
  • NumericGroupSeparator$Number接受NumericGroupSeparator字符(美式格式:逗號()或空格;歐式格式:句點(.)。或空格)。它接受並剝離任意數量的NumericGroupSeparator字符,而與位置無關。例如,在美國格式中,它將“12 3,,4,56.9,9”驗證爲數字123456.99$Normalize不識別NumericGroupSeparator字符。它逐個字符進行驗證,直到遇到非數字字符;例如,它將“123,456.99”驗證爲數字123$ISVALIDNUM將字符串“123,456”作爲無效數字拒絕。
  • 數字的所有三個函數都解釋多個前導符號(+-)。但是,只有$Normalize接受帶引號的數字字符串中的多個前導符號。
  • 尾隨+-符號:這三個函數都拒絕數字中的尾隨符號。但是,在帶引號的數字字符串$NUMBER中,$NORMALIZE解析一個(且只有一個)尾隨符號,$NORMALIZE解析多個尾隨符號,$ISVALIDNUM拒絕任何包含尾隨符號的字符串作爲無效數字。
  • 括號:$number將帶引號的字符串中無符號數字周圍的括號解析爲負數。$Normalize$ISVALIDNUM拒絕括號。
  • 包含多個小數字符的數字字符串:$NORMALIZE逐個字符進行驗證,直到遇到第二個小數字符。例如,在美國格式中,它將“123.4.56”驗證爲數字123.4$NUMBER$ISVALIDNUM拒絕任何包含一個以上小數字符的字符串作爲無效數字。

包含其他非數字字符的數字字符串:$Normize逐個字符進行驗證,直到遇到字母字符。它確認“123A456”爲數字123$NUMBER$ISVALIDNUM驗證整個字符串,它們將“123A456”作爲無效數字拒絕。

  • 空字符串:$Normalize將空字符串解析爲零(0)。$NUMBER$ISVALIDNUM拒絕空字符串。

$ISVALIDNUM$NUMBER函數提供可選的最小/最大範圍檢查。

$ISVALIDNUM$NORMALIZE$NUMBER都提供將數字舍入到指定的小數位數。$ISVALIDNUM$NORMALIZE可以對小數位進行舍入,並對帶有小數部分的數字進行舍入或截斷以返回整數。例如,$NORMALIZE可以將488.65舍入到488.7489,也可以將其截斷爲488$number既可以舍入小數位,也可以舍入整數位。例如,$NUMBER可以取整爲488.65488.7

DHC-APP>w $number(488.65)
488.65
DHC-APP>w $number(488.65,1)
488.7
DHC-APP>w $number(488.65,0)
489
DHC-APP>w $NORMALIZE(488.65,0)
489
DHC-APP>w $NORMALIZE(488.65,1)
488.7
DHC-APP>w $NORMALIZE(488.65,3)
488.65
DHC-APP>w $NORMALIZE(488.65,-1)
488

$NORMALIZE 可以直接取整,$number可以四捨五入 ,二者都可以返回數字。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章