第二十三章 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
,-INF
或NAN
值,則$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
、-INF
和NaN
值作爲有效數字。$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.7
或489
,也可以將其截斷爲488
。$number
既可以舍入小數位,也可以舍入整數位。例如,$NUMBER
可以取整爲488.65
到488.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
可以四捨五入 ,二者都可以返回數字。