第二十二章 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
、-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”
作爲無效數字拒絕。 - 這兩個函數都解析數字的多個前導符號(
+
和-
)。兩者都不接受帶引號的數字字符串中的多個前導符號。
DHC-APP>w $ISVALIDDOUBLE("0")
1
DHC-APP>w $ISVALIDDOUBLE("+0")
1
DHC-APP>w $ISVALIDDOUBLE("++0")
0