第十七章 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” ;返回的INF 或NaN 將以相應的大寫或小寫字母表示。默認值爲大寫。 |
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 MinusSign 和DecimalSeparator 。此格式代碼與點(.) 不兼容。格式化代碼。當與逗號格式代碼(“O,”) 一起使用時,數字使用ODBC小數分隔符和ODBC數字組分隔符進行格式化。 |
P |
括號符號。返回括號中沒有前導MinusSign 區域設置屬性值的負數。否則,它返回不帶括號但帶有前導和尾隨空格字符的數字。此代碼不能與“+”、“-”、“L”或“T” 格式代碼一起使用;嘗試這樣做會導致<SYNTAX> 錯誤。 |
T |
尾部標誌。如果否則會生成前綴符號,則返回帶有尾隨符號的數字。但是,它不會強制使用尾隨標誌。要爲非負數(正數或零)生成尾號,還必須指定“+” 格式代碼。要爲負數生成尾號,不能指定“-” 格式代碼。使用的尾號分別由當前區域設置的PlusSign 和MinusSign 屬性確定。在省略“+” 的非負數或指定了“-” 的負數的情況下,插入尾隨空格字符,但不插入符號。不允許使用括號。此代碼不能與“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
表示爲數字。例如:+ INF
,INF-
,(INF)
。 NAN
不帶標誌;影響NAN
的唯一格式代碼是“ d”
,它以小寫字母返回。 “ E”
和“ G”
代碼對INF
和NAN
值沒有影響。
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
使用當前區域設置的PlusSign
和MinusSign
屬性值(默認情況下爲“+”
和“-”
)。當“。”
如果指定了格式代碼,則無論當前區域設置如何,這些符號都將設置爲“+”
和“-”
。
要確定區域設置的PlusSign
和MinusSign
字符,請調用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
,“-”
和“+”
是互斥的。 “-”
表示不允許使用符號,“ +”
表示必須使用符號。