第二十章 Caché 函數大全 $INUMBER 函數
驗證數字值並將其轉換爲內部格式。
大綱
$INUMBER(fnumber,format,erropt)
$IN(fnumber,format,erropt)
參數
- fnumber 要轉換爲內部格式的數值。它可以是數字或字符串值,變量名或任何有效的CachéObjectScript表達式。
- format 格式規範,指示哪些外部數字格式是數字的有效表示形式。指定爲帶引號的字符串,該字符串由零個或多個格式代碼組成(以任意順序)。格式代碼如下所述。請注意,某些格式代碼不兼容並導致錯誤。對於默認格式,無論是否帶有erropt參數,都可以指定空字符串(
“”
)。 - erropt 可選-如果根據格式認爲fnumber無效,則返回表達式。
描述
$INUMBER
函數使用格式指定的格式來驗證數值fnumber。然後將其轉換爲內部Caché格式。
如果fnumber與指定的格式不對應,並且未指定erropt,則Caché會生成<ILLEGAL VALUE>
錯誤。如果指定了erropt,則無效的數值將返回erropt字符串。
參數
format
可能的格式代碼如下。可以單獨指定或組合指定它們,以指示$iNumber
嚴格遵守格式規則。如果未輸入格式代碼,$iNumber
將在驗證fnumber時儘可能靈活
代碼 | 描述 |
---|---|
+ |
強制性標誌。 fnumber值必須有一個明確的符號。即使數字0也必須簽名(+0或-0)。除非受“L ”或“T ”格式代碼的限制,否則該符號可以是開頭或結尾。不能使用括號。唯一不需要符號的值是NAN ,使用代碼“D + ”時可以指定帶或不帶符號。 |
- |
未簽名。 fnumber中可能沒有符號。 |
D |
$DOUBLE 數字。此代碼將數字轉換爲IEEE浮點數。這等效於$DOUBLE(fnumber) 。 如果指定“D” ,則可以輸入帶引號的字符串“INF” 和“ NAN” 作爲fnumber值。INF 和NAN 可以以大小寫字母的任意組合指定,帶有或不帶有前導或尾隨符號或括號。(對於NAN ,可接受但忽略符號。)還支持變體形式INFINITY 和SNAN 。 |
E 或 G
|
電子記數法(科學記數法)。此代碼允許將fnumber指定爲科學記數法格式的字符串。此代碼允許(但不要求)使用科學記數法指定fnumber。 |
N |
沒有NumericGroupSeparator 。不允許使用數字組分隔符。此格式代碼與逗號(, )格式代碼不兼容。 |
O |
ODBC區域設置。覆蓋當前區域設置,而使用具有下列值的標準ODBC區域設置:PlusSign=+;MinusSign=-;DecimalSeparator=.;NumericGroupSeparator=,;NumericGroupSize=3 。此格式代碼與點(. )不兼容。格式化代碼。 |
P |
負數必須用括號括起來。非負數必須是無符號的,並且可以包含或省略前導空格和尾隨空格。 |
L |
先導標誌。符號(如果存在)必須在fnumber的數字部分之前。不允許使用括號。 |
T |
尾部標誌。符號(如果有)必須跟在fnumber的數字部分之後。不允許使用括號。 |
, |
期望fnumber使用當前語言環境中的屬性指定的格式。 NumericGroupSeparator (默認情況下爲“, ”)可能會出現也可能不會出現在fnumber中,但如果存在,它必須始終出現在小數點左邊的每個NumericGroupSize (默認情況下爲3)位。 |
. |
無論當前的區域設置如何,都需要標準的歐洲格式。要求將DecimalSeparator 作爲逗號(, ),將NumericGroupSeparator 作爲句點(. ),將NumericGroupSize 作爲3,將PlusSign 作爲加號(+ ),將MinusSign 作爲減號(- )。句點是可選的,但如果存在,則必須始終每三位出現在小數點逗號左側。 |
當沒有“+”、“-”和“P”格式代碼時
如果FORMAT不包括任何“+”、“-”或“P”
代碼,則fnumber可以包含以下任一代碼:
- 沒有符號或括號。
-
PlusSign
區域設置屬性(默認爲“+”
)或MinusSign
區域設置屬性(默認爲“-”
),但不能同時使用這兩個屬性。此標誌的位置由“L”
或“T”
格式代碼(如果指定)確定。 - 前導括號和尾隨括號。
當沒有“L”、“T”和“P”格式代碼時
當FORMAT
不包括任何“L”、“T”或“P”
格式代碼時,fnumber中出現的任何符號可以是前導或尾隨(但不能同時爲兩者)。
何時“、”和“。”缺少格式代碼
當格式既不包括“,”
也不包括“”
時。"。
"格式代碼,fnumber可以選擇讓NumericGroupSeparator
符號出現在DecimalSeparator
(如果有的話)左側或右側的任何位置。但是,每個NumericGroupSeparator
的左邊和右邊都必須至少有一個數字。當FORMAT
包含“N”
時,不允許使用NumericGroupSeparator
符號。
互斥格式代碼
某些格式代碼相互衝突。以下格式代碼對中的每一對都是互斥的,並會導致錯誤:
-
“-+”
導致<FUNCTION>
錯誤 -
“ -P”或“ + P”
導致<SYNTAX>
錯誤 -
“ TP”或“ LP”
導致<SYNTAX>
錯誤 -
“ TL”
導致<FUNCTION>
錯誤 -
“、。”
導致<FUNCTION>
錯誤 -
“,N”
導致<FUNCTION>
錯誤 -
“.o”
導致<FUNCTION>
錯誤
如果指定無效的格式代碼字符,也會生成<FUNCTION>
錯誤。
NULL格式提供了最大的靈活性
可以將格式指定爲空字符串。這稱爲空格式。指定空格式時,$INUMBER
接受具有以下符號約定中的任何一種的fnumber值:
- 沒有符號或括號。
- 前導或尾隨的
MinusSign
,但不能同時使用。 - 前導加號或尾隨加號,但不能同時使用。
- 前導括號和尾隨括號。
如果指定了null格式,則fnumber可以選擇使NumericGroupSeparator
符號出現在DecimalSeparator
左側或右側的任何位置(如果有)。但是,每個NumericGroupSeparator
的左端必須至少有一個數字,而其右端必須至少有一個數字。簽名規則很靈活,前導空格和尾隨空格和零都將被忽略。因此,以下兩個命令:
DHC-APP>WRITE !,$INUMBER("+1,23,456,7.8,9,100","")
1234567.891
DHC-APP> WRITE !,$INUMBER("0012,3456,7.891+","")
1234567.891
都有效,並且返回相同的數字,並根據默認語言環境設置格式。然而,
DHC-APP>WRITE $INUMBER("1,23,,345,7.,8,9,","")
WRITE $INUMBER("1,23,,345,7.,8,9,","")
^
<ILLEGAL VALUE>
由於相鄰的逗號,相鄰的句點和逗號以及結尾的逗號而無效。它生成一個錯誤。
所有格式的共同行爲
不管指定的格式代碼如何,$INUMBER
始終忽略開頭和結尾的空格或零,但是如果fnumber具有以下任何特徵,則認爲fnumber無效:
- 加號和減號都有
- 多個加號或減號
- 括號和加號
- 括號和減號
- 多個小數分隔符
- 嵌入空格
- 以下字符以外的任何字符:
- 數字位數
“(“
“)”
- 前導空格或尾隨空格
- 由當前區域設置指定的
DecimalSeparator
(如果格式不包括“.”
) - 當前語言環境指定的
NumericGroupSeparator
(如果格式不包含“。”
) - 當前語言環境指定的
PlusSign
屬性(如果格式不包含“。”
) - 當前語言環境指定的
MinusSign
屬性(如果格式不包含“。”
) -
“.”
(如果格式包括“.”
) -
“,”
(如果格式包括“.”
) -
“+”
(如果格式包括“.”
) -
“-”
(如果格式包括“ .”
)
- 如果格式包括
“D”
,則字符串“INF”
和“NAN”
(及其變體)。
示例
這些示例說明了不同的格式如何影響$INUMBER
的行爲。所有這些示例均假定當前語言環境爲默認語言環境。
在下面的示例中,$INUMBER
由於使用“L”
格式代碼而接受一個減號,並返回-123456789.12345678
:
DHC-APP>WRITE $INUMBER("-123,4,56,789.1234,5678","L")
-123456789.12345678
在以下示例中,$INUMBER
生成一個錯誤,因爲該符號在前,但是“T”
格式代碼指定必須使用結尾的符號:
DHC-APP>WRITE $INUMBER("-123,4,56,789.1234,5678","T")
WRITE $INUMBER("-123,4,56,789.1234,5678","T")
^
<ILLEGAL VALUE>
DHC-APP>WRITE $INUMBER("123,4,56,789.1234,5678+","T")
123456789.12345678
DHC-APP>WRITE $INUMBER("123,4,56,789.1234,5678-","T")
-123456789.12345678
在下面的示例中,第一個$INUMBER
成功並返回負數。第二個$INUMBER
生成一個錯誤,因爲fnumber包含一個符號,但是“P”
格式代碼指定負數必須用括號括起來而不是帶符號:
DHC-APP>WRITE !,$INUMBER("(123,4,56,789.1234,5678)","P")
-123456789.12345678
DHC-APP>WRITE !,$INUMBER("-123,4,56,789.1234,5678","P")
WRITE !,$INUMBER("-123,4,56,789.1234,5678","P")
^
<ILLEGAL VALUE>
在下面的示例中,$INUMBER
生成錯誤,因爲存在符號,但是“-”
格式代碼指定數字必須爲無符號:
DHC-APP>WRITE $INUMBER("-123,4,56,789.1234,5678","-")
WRITE $INUMBER("-123,4,56,789.1234,5678","-")
^
<ILLEGAL VALUE>
DHC-APP>WRITE $INUMBER("123,4,56,789.1234,5678","-")
123456789.12345678
在以下示例中,$INUMBER
失敗,但由於非法使用符號而不會產生錯誤,而是返回指定爲錯誤的字符串“ERR”
作爲其值:
DHC-APP>WRITE $INUMBER("-123,4,56,789.1234,5678","-","ERR")
ERR
以下示例返回-23456789.123456789
; $INUMBER
將指定的fnumber視爲有效,因爲前導符號遵循“L”
指定的格式,並且小數點左邊每三位數的逗號嚴格間隔,其右無逗號遵循 “,”指定的嚴格格式”代碼:
DHC-APP> WRITE $INUMBER("-23,456,789.123456789","L,")
-23456789.123456789
在以下示例中,“E”
代碼允許將科學符號字符串轉換爲數字。請注意,所有格式代碼都支持科學記數法作爲數字文字,但是隻有“E”
(或“G”
)支持科學記數法作爲字符串。本示例使用變量和串聯來提供科學計數字符串值:
DHC-APP>SET num=1.234
DHC-APP>SET exp=-14
DHC-APP>WRITE $INUMBER(1.234E-14,"E","E-lit-err"),!
.00000000000001234
DHC-APP>WRITE $INUMBER(num_"E"_exp,"E","E-string-err"),!
.00000000000001234
DHC-APP>WRITE $INUMBER(1.234E-14,"L","L-lit-err"),!
.00000000000001234
DHC-APP>WRITE $INUMBER(num_"E"_exp,"L","L-string-err"),!
L-string-err
下面的示例比較“L”
代碼和“D”
代碼返回的值的分數和常數pi
。 “D”
代碼轉換爲IEEE浮點數($DOUBLE
):
DHC-APP>WRITE $INUMBER(1.23E-23,"L"),!
.0000000000000000000000123
DHC-APP>WRITE $INUMBER(1.23E-23,"D"),!
.000000000000000000000012299999999999999704
DHC-APP>WRITE $INUMBER($ZPI,"L"),!
3.141592653589793238
DHC-APP>WRITE $INUMBER($ZPI,"D"),!
3.1415926535897931159
注意
$NUMBER
和$FNUMBER
之間的差異
大多數格式代碼在$INUMBER
和$FNUMBER
函數中具有相似的含義,但是由於執行的驗證和轉換的性質,每個代碼觸發的確切行爲因函數而異。
特別是,“-”
和“+”
格式代碼對$INUMBER
的含義與對$FNUMBER
的含義完全不同。對於$FNUMBER
,“-”
和“+”
不互斥,“-”
僅影響MinusSign
(通過抑制它),而“+”
僅影響PlusSign
(通過插入它)。對於$INUMBER
,“-”
和“+”
是互斥的。 “-”
表示不允許使用符號,“+”
表示必須使用符號。
小數點分隔符
$INUMBER
使用當前區域設置(“.”
)的DecimalSeparator
屬性值。默認情況下)作爲fnumber的整數部分和小數部分之間的分隔符。當“。”
如果指定了格式代碼,則此分隔符爲“,”
,而與當前區域設置無關。
若要確定區域設置的DecimalSeparator
字符,請調用GetFormatItem()
方法:
DHC-APP> WRITE ##class(%SYS.NLS.Format).GetFormatItem("DecimalSeparator")
.
數字分組分隔符和大小
$INUMBER
使用當前區域設置中的NumericGroupSeparator
屬性值(默認情況下“,”
)作爲fnumber整數部分中數字組之間的分隔符。這些組的大小由當前區域設置的NumericGroupSize
屬性(默認情況下爲“3”
)確定。當“。”
指定了格式碼,則此分隔符爲“。並且每三位數顯示一次,與當前區域設置無關。
要確定區域設置的NumericGroupSeparator
字符和NumericGroupSize
編號,請調用GetFormatItem()
方法:
DHC-APP>WRITE ##class(%SYS.NLS.Format).GetFormatItem("NumericGroupSeparator"),!
,
DHC-APP> WRITE ##class(%SYS.NLS.Format).GetFormatItem("NumericGroupSize")
3
加號和減號
$iNumber
使用當前區域設置中的PlusSign
和MinusSign
屬性值(默認情況下爲“+”
和“-”
)。當“。”
如果指定了格式代碼,則無論當前區域設置如何,這些符號都將設置爲“+”
和“-”
。
要確定的區域設置的PlusSign
和MinusSign
字符,請調用GetFormatItem()
方法:
DHC-APP> WRITE ##class(%SYS.NLS.Format).GetFormatItem("PlusSign"),!
+
DHC-APP>WRITE ##class(%SYS.NLS.Format).GetFormatItem("MinusSign")
-