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

第十七章 Caché 函數大全 $FNUMBER 函數

使用指定格式格式化數值; (可選)四捨五入或零填充到指定的精度。

大綱

$FNUMBER(inumber,format,decimal)
$FN(inumber,format,decimal)

參數

  • inumber 要格式化的數字。它可以是數字文字,變量或任何有效的ObjectScript表達式,其計算結果爲數字值。
  • format 可選-指定數字的格式。指定爲帶引號的字符串,該字符串由零個或多個格式代碼組成(以任意順序)。格式代碼如下所述。請注意,某些格式代碼不兼容並導致錯誤。對於默認格式,可以使用或不使用十進制參數,都可以指定空字符串(“”)。如果省略,則默認爲空字符串(“”)。
  • decimal 可選-要包含在返回數字中的小數小數位數。如果省略格式,請在指定小數點前添加一個佔位符逗號。

描述

$FNUMBER以指定格式返回由數字指定的數字。

參數

inumber

解析爲數字的表達式。在$FNUMBER執行任何操作之前,Caché對inNumber執行其標準數字解析,如下所示:解析變量,執行字符串操作(如連接),將字符串轉換爲數字,執行數字表達式操作,然後將生成的數字轉換爲規範形式。這是$FNUMBER格式化的數字。

如果inumber是字符串,則Caché首先將其轉換爲數字,並在第一個非數字字符處截斷。如果字符串的第一個字符不是數字字符,則Caché會將字符串轉換爲0。

format

可能的格式代碼如下。可以單獨指定它們,也可以組合指定它們。字母代碼不區分大小寫。

代碼 描述
"" 空字符串。以規範數字格式返回信息編號。此格式與“L”格式相同。
+ 返回以當前語言環境的PlusSign屬性爲前綴的非負數(默認爲“ +”)。如果數字爲負,則返回以當前語言環境的MinusSign屬性爲前綴的數字(默認爲“-”)。
- 返回數字的絕對值。始終返回不帶MinusSign字符的負數。返回不帶PlusSign字符的正數。與“ +”格式代碼(“-+”)結合使用時,將返回帶有加號的正數,沒有符號的負數。此代碼不能與“ P”格式代碼一起使用;嘗試這樣做會導致<SYNTAX>錯誤。
, 返回帶有當前語言環境的NumericGroupSeparator屬性值的數字,該數字在小數點左側的每個NumericGroupSize數字處插入。將“,”“。”組合或“ N”格式會導致錯誤。
. 無論當前的語言環境設置如何,都使用標準的歐洲格式返回數字。將DecimalSeparator設置爲逗號(,),將NumericGroupSeparator設置爲句點(。),將NumericGroupSize設置爲3,將PlusSign設置爲加號(+),將MinusSign設置爲減號(-)。結合“。”帶有“,”“ O”格式的文件會導致<FUNCTION>錯誤。
D $DOUBLE特殊格式。此代碼有兩個效果:“D”指定$DOUBLE(-0)應返回-0;否則,$DOUBLE(-0)返回0。但是,“-D”覆蓋負號並返回0。可以爲該代碼指定“D”“d”;返回的INFNaN將以相應的大寫或小寫字母表示。默認值爲大寫。
E 電子記數法(科學記數法)。返回以科學記數法表示的數字。如果省略小數位數,則使用6作爲默認值。可以爲此代碼指定“E”“e”;返回值將包含相應的大寫或小寫符號。除非需要三位指數數字,否則返回值的指數部分長度爲兩位數字,並帶有前導符號。“E”“G”不兼容,導致<FUNCTION>錯誤。
G E表示法或固定的十進制表示法。如果轉換爲科學計數法所得的小數位數大於十進制值(或默認值爲6個十進制數字),則以科學計數法返回該數字。例如,, $FNUMBER(1234.99,"G",2)返回1.23E + 03。如果轉換爲科學計數法所得的小數位數等於或小於十進制值(或默認爲6個十進制數字),則以固定的十進制(標準)表示法返回該數字。例如 $FNUMBER(1234.99,"G",3)返回1235。可以爲此代碼指定“ G”“ g”;返回的科學計數值將包含相應的大寫字母“ E”或小寫字母“ e”“ E”“ G”不兼容,並導致錯誤。
L 前導標誌。如果存在符號,則符號必須在inumber的數字部分之前。不允許使用括號。此代碼不能與“ P”“ T”格式代碼一起使用;嘗試這樣做會導致或錯誤。前導符號是默認格式。
N 沒有NumericGroupSeparator。不允許使用數字組分隔符。此格式代碼與逗號(,)格式代碼不兼容。與點格式代碼(“N”)一起使用時,數字的格式使用歐洲小數分隔符,但不使用數字組分隔符。前導符號是默認格式。
O ODBC區域設置。覆蓋當前區域設置,而使用具有下列值的標準ODBC區域設置:PlusSign=+MinusSign=-DecimalSeparator=.NumericGroupSeparator=,NumericGroupSize=3.就其本身而言,“O”格式的代碼只使用ODBC MinusSignDecimalSeparator。此格式代碼與點(.)不兼容。格式化代碼。當與逗號格式代碼(“O,”)一起使用時,數字使用ODBC小數分隔符和ODBC數字組分隔符進行格式化。
P 括號符號。返回括號中沒有前導MinusSign區域設置屬性值的負數。否則,它返回不帶括號但帶有前導和尾隨空格字符的數字。此代碼不能與“+”、“-”、“L”或“T”格式代碼一起使用;嘗試這樣做會導致<SYNTAX>錯誤。
T 尾部標誌。如果否則會生成前綴符號,則返回帶有尾隨符號的數字。但是,它不會強制使用尾隨標誌。要爲非負數(正數或零)生成尾號,還必須指定“+”格式代碼。要爲負數生成尾號,不能指定“-”格式代碼。使用的尾號分別由當前區域設置的PlusSignMinusSign屬性確定。在省略“+”的非負數或指定了“-”的負數的情況下,插入尾隨空格字符,但不插入符號。不允許使用括號。此代碼不能與“L”“P”格式代碼一起使用;嘗試這樣做會導致<SYNTAX><Function>錯誤。

在Caché中,小於1的小數以不帶零整數的Caché規範形式表示:0.66變爲.66。這是$FNUMBER的默認值。但是,大多數$FNUMBER FORMAT選項返回小於1的帶有前導零整數的小數:.66變爲0.66。兩參數$FNUMBER,其格式爲“”(空字符串),“ L”(在功能上與空字符串相同)和“ D”以標準形式返回小於1的小數:.66。所有其他兩參數$FNUMBER格式選項和所有三參數$FNUMBER格式選項都返回小於1的小數,並帶有單個前導零整數:000.66.66都變爲0.66。這是JSON數字的小數數字格式。

$DOUBLE函數可以返回值INF(無限)和NAN(不是數字)。 INF可能帶有負號;格式代碼將INF表示爲數字。例如:+ INFINF-(INF)NAN不帶標誌;影響NAN的唯一格式代碼是“ d”,它以小寫字母返回。 “ E”“ G”代碼對INFNAN值沒有影響。

decimal

十進制參數指定要包含在返回值中的小數位數。將十進制指定爲正整數,或者將任何有效的ObjectScript變量或表達式指定爲正整數。如果十進制爲負數,則Caché會將其視爲0值。如果十進制是小數,則Caché會截斷爲整數部分。

  • 如果小數大於inumber中的小數位數,則其餘位置將填充零。
  • 如果小數小於inumber中的小數位數,則Caché將inumber舍入爲適當的小數位數。
  • 如果十進制爲0,則inumber作爲不帶小數點分隔符的整數返回。 Caché將inumber舍入爲適當的整數。

如果inumber小於1且十進制大於0,則$FNUMBER始終在小數點分隔符前的整數位置返回單個零,而不考慮格式值。小數的這種表示形式不同於Caché規範形式。

舍入後,可以指定十進制參數來控制返回的小數位數。例如,假設變量c包含數字6.25198

DHC-APP>SET c="6.25198"
 
DHC-APP>SET x=$FNUMBER(c,"+",3)
 
DHC-APP>SET y=$FNUMBER(c,"+",8)
 
DHC-APP>WRITE !,x,!,y
 
+6.252
+6.25198000

第一個$FNUMBER返回+6.252,第二個返回+6.25198000

示例

以下示例顯示不同的格式指定如何影響$FNUMBER的行爲。這些示例假定當前區域設置爲默認區域設置。

下面的示例顯示符號代碼對正數的影響:

/// d ##class(PHA.TEST.Function).FNUMBER()
ClassMethod FNUMBER()
{
    SET a=1234
    WRITE $FNUMBER(a,""),!   ; returns 1234
    WRITE $FNUMBER(a,"+"),!  ; returns +1234
    WRITE $FNUMBER(a,"-"),!  ; returns 1234
    WRITE $FNUMBER(a,"L"),!  ; returns 1234
    WRITE $FNUMBER(a,"T"),!  ; returns 1234 (with a trailing space)
    WRITE $FNUMBER(a,"T+"),! ; returns 1234+
}
DHC-APP>d ##class(PHA.TEST.Function).FNUMBER()
1234
+1234
1234
1234
1234
1234+

下面的示例顯示符號代碼對負數的影響:

/// d ##class(PHA.TEST.Function).FNUMBER1()
ClassMethod FNUMBER1()
{
    SET b=-1234
    WRITE $FNUMBER(b,""),!  ; returns -1234
    WRITE $FNUMBER(b,"+"),! ; returns -1234
    WRITE $FNUMBER(b,"-"),! ; returns 1234
    WRITE $FNUMBER(b,"L"),! ; returns -1234
    WRITE $FNUMBER(b,"T"),! ; returns 1234-
}
DHC-APP>d ##class(PHA.TEST.Function).FNUMBER1()
-1234
-1234
1234
-1234
1234-

下面的示例顯示“P”格式代碼對正數和負數的影響。此示例在數字前後分別寫入星號,以表明返回的正數帶有前導空格和尾隨空格:

DHC-APP>WRITE "*",$FNUMBER(-123,"P"),"*",!
*(123)*
 
DHC-APP> WRITE "*",$FNUMBER(123,"P"),"*",!
* 123 *

下面的示例返回1,234,567.81“,”格式以美國格式返回x,插入逗號作爲數字組分隔符,並使用句點作爲小數點分隔符:

DHC-APP>SET x=1234567.81
 
DHC-APP>WRITE $FNUMBER(x,",")
1,234,567.81

下面的示例返回1.234.567,81“。” format以歐洲格式返回x,插入句點作爲數字組分隔符,並插入逗號作爲十進制分隔符:

DHC-APP>SET x=1234567.81
 
DHC-APP>WRITE $FNUMBER(x,".")
1.234.567,81

以下3參數示例返回124,329.00$FNUMBER插入一個逗號作爲數字組分隔符,添加一個句點作爲十進制分隔符,並在x的值後附加兩個零作爲小數位。

DHC-APP>SET x=124329
 
DHC-APP>WRITE $FNUMBER(x,",",2)
124,329.00

以下3參數示例返回124329.00。省略的格式由佔位符逗號表示;十進制將兩個零作爲小數位附加到x的值。

DHC-APP>SET x=124329
 
DHC-APP>WRITE $FNUMBER(x,"",2)
124329.00

以下3參數示例返回0.78。省略的格式由佔位符逗號表示;十進制舍入到2個小數位;十進制還會附加整數0,覆蓋默認格式:

DHC-APP>SET x=.7799
 
DHC-APP>WRITE $FNUMBER(x,"",2)
0.78

負小數

/// d ##class(PHA.TEST.Function).FNUMBER2()
ClassMethod FNUMBER2()
{
    SET b=-.66
    WRITE " :" _ $FNUMBER(b,""),!  
    WRITE "+:" _ $FNUMBER(b,"+"),! 
    WRITE "-:" _ $FNUMBER(b,"-"),! 
    WRITE "L:" _ $FNUMBER(b,"L"),!
    WRITE "T:" _ $FNUMBER(b,"T"),!
    WRITE "N:" _ $FNUMBER(b,"N"),!
    WRITE "E:" _ $FNUMBER(b,"E"),! 
    WRITE "D:" _ $FNUMBER(b,"D"),! 
    WRITE "G:" _ $FNUMBER(b,"G"),! 
    WRITE "O:" _ $FNUMBER(b,"O"),! 
    WRITE "P:" _ $FNUMBER(b,"P"),!
}
DHC-APP>d ##class(PHA.TEST.Function).FNUMBER2()
 :-.66
+:-0.66
-:0.66
L:-.66
T:0.66-
N:-0.66
E:-6.600000E-01
D:-.66
G:-0.6600000
O:-0.66
P:(0.66)
 

正小數

/// d ##class(PHA.TEST.Function).FNUMBER3()
ClassMethod FNUMBER3()
{
    SET b=.66
    WRITE " :" _ $FNUMBER(b,""),!  
    WRITE "+:" _ $FNUMBER(b,"+"),! 
    WRITE "-:" _ $FNUMBER(b,"-"),! 
    WRITE "L:" _ $FNUMBER(b,"L"),!
    WRITE "T:" _ $FNUMBER(b,"T"),!
    WRITE "N:" _ $FNUMBER(b,"N"),!
    WRITE "E:" _ $FNUMBER(b,"E"),! 
    WRITE "D:" _ $FNUMBER(b,"D"),! 
    WRITE "G:" _ $FNUMBER(b,"G"),! 
    WRITE "O:" _ $FNUMBER(b,"O"),! 
    WRITE "P:" _ $FNUMBER(b,"P"),!
}

DHC-APP>d ##class(PHA.TEST.Function).FNUMBER3()
 :.66
+:+0.66
-:0.66
L:.66
T:0.66
N:0.66
E:6.600000E-01
D:.66
G:0.6600000
O:0.66
P: 0.66

注意:格式“-” 絕對值 “N” 小數,整數部分添加0,“T” 尾部添加操作符。
“E”科學計數法,“”“L”相同

注意

小數點分隔符

$FNUMBER使用當前區域設置(“.”)的DecimalSeparator屬性值。默認情況下)作爲返回數字的整數部分和小數部分之間的分隔符。當“。”如果指定了格式代碼,則無論當前區域設置如何,此分隔符都是“,”

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

DHC-APP>WRITE ##class(%SYS.NLS.Format).GetFormatItem("DecimalSeparator")
.

數字分組分隔符和大小

當格式字符串包含“”時,$FNUMBER使用當前區域設置中的NumericGroupSeparator屬性值作爲返回數字整數部分的數字組之間的分隔符。這些組的大小由當前區域設置的NumericGroupSize屬性確定。

英語語言環境默認爲逗號(“,”)作爲NumericGroupSeparator,3作爲NumericGroupSize。許多歐洲地區使用句點(“.”)。作爲NumericGroupSeparator。俄語(Rusw)、烏克蘭語(Ukrw)和捷克語(Csyw)區域設置使用空格作爲NumericGroupSeparator。所有區域設置(包括日語)的NumericGroupSize默認爲3。(日語用戶可能希望根據上下文將整數數字以3或4爲單位進行分組。)

當格式字符串包含“.”時。(不包括“N”)$FNUMBER使用NumericGroupSeparator=“。”NumericGroupSize=3來格式化返回值,而不考慮當前的區域設置。

要確定區域設置的NumericGroupSeparator字符和NumericGroupSize編號,請調用GetFormatItem()方法:

DHC-APP>WRITE ##class(%SYS.NLS.Format).GetFormatItem("NumericGroupSeparator"),!
,
 
DHC-APP>WRITE ##class(%SYS.NLS.Format).GetFormatItem("NumericGroupSize")
3
DHC-APP>

加號和減號

$FNUMBER使用當前區域設置的PlusSignMinusSign屬性值(默認情況下爲“+”“-”)。當“。”如果指定了格式代碼,則無論當前區域設置如何,這些符號都將設置爲“+”“-”

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

DHC-APP>WRITE ##class(%SYS.NLS.Format).GetFormatItem("PlusSign")
+
DHC-APP>WRITE ##class(%SYS.NLS.Format).GetFormatItem("MinusSign")
-

$FNUMBER$INUMBER之間的差異

大多數格式代碼在$FNUMBER$INUMBER函數中具有相似的含義,但是由於執行的驗證和轉換的性質,每個代碼觸發的確切行爲因函數而異。

特別是,“-”“+”格式代碼對$FNUMBER的含義與對$INUMBER的含義完全不同。對於$FNUMBER“-”“+”不是互斥的,“-”僅影響MinusSign(通過抑制它),而“+”僅影響PlusSign(通過插入它)。對於$INUMBER“-”“+”是互斥的。 “-”表示不允許使用符號,“ +”表示必須使用符號。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章