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

第二十二章 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章