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

第二十章 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值。INFNAN可以以大小寫字母的任意組合指定,帶有或不帶有前導或尾隨符號或括號。(對於NAN,可接受但忽略符號。)還支持變體形式INFINITYSNAN
EG 電子記數法(科學記數法)。此代碼允許將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使用當前區域設置中的PlusSignMinusSign屬性值(默認情況下爲“+”“-”)。當“。”如果指定了格式代碼,則無論當前區域設置如何,這些符號都將設置爲“+”“-”

要確定的區域設置的PlusSignMinusSign字符,請調用GetFormatItem()方法:

DHC-APP> WRITE ##class(%SYS.NLS.Format).GetFormatItem("PlusSign"),!
+
 
DHC-APP>WRITE ##class(%SYS.NLS.Format).GetFormatItem("MinusSign")
-
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章