第十七章 Caché 函數(shù)大全 $FNUMBER 函數(shù)
使用指定格式格式化數(shù)值; (可選)四舍五入或零填充到指定的精度。
大綱
$FNUMBER(inumber,format,decimal)
$FN(inumber,format,decimal)
參數(shù)
- inumber 要格式化的數(shù)字。它可以是數(shù)字文字,變量或任何有效的ObjectScript表達(dá)式,其計(jì)算結(jié)果為數(shù)字值。
- format 可選-指定數(shù)字的格式。指定為帶引號(hào)的字符串,該字符串由零個(gè)或多個(gè)格式代碼組成(以任意順序)。格式代碼如下所述。請(qǐng)注意,某些格式代碼不兼容并導(dǎo)致錯(cuò)誤。對(duì)于默認(rèn)格式,可以使用或不使用十進(jìn)制參數(shù),都可以指定空字符串(
“”)。如果省略,則默認(rèn)為空字符串(“”)。 - decimal 可選-要包含在返回?cái)?shù)字中的小數(shù)小數(shù)位數(shù)。如果省略格式,請(qǐng)?jiān)谥付ㄐ?shù)點(diǎn)前添加一個(gè)占位符逗號(hào)。
描述
$FNUMBER以指定格式返回由數(shù)字指定的數(shù)字。
參數(shù)
inumber
解析為數(shù)字的表達(dá)式。在$FNUMBER執(zhí)行任何操作之前,Caché對(duì)inNumber執(zhí)行其標(biāo)準(zhǔn)數(shù)字解析,如下所示:解析變量,執(zhí)行字符串操作(如連接),將字符串轉(zhuǎn)換為數(shù)字,執(zhí)行數(shù)字表達(dá)式操作,然后將生成的數(shù)字轉(zhuǎn)換為規(guī)范形式。這是$FNUMBER格式化的數(shù)字。
如果inumber是字符串,則Caché首先將其轉(zhuǎn)換為數(shù)字,并在第一個(gè)非數(shù)字字符處截?cái)唷H绻址牡谝粋€(gè)字符不是數(shù)字字符,則Caché會(huì)將字符串轉(zhuǎn)換為0。
format
可能的格式代碼如下。可以單獨(dú)指定它們,也可以組合指定它們。字母代碼不區(qū)分大小寫。
| 代碼 | 描述 |
|---|---|
"" |
空字符串。以規(guī)范數(shù)字格式返回信息編號(hào)。此格式與“L”格式相同。 |
+ |
返回以當(dāng)前語(yǔ)言環(huán)境的PlusSign屬性為前綴的非負(fù)數(shù)(默認(rèn)為“ +”)。如果數(shù)字為負(fù),則返回以當(dāng)前語(yǔ)言環(huán)境的MinusSign屬性為前綴的數(shù)字(默認(rèn)為“-”)。 |
- |
返回?cái)?shù)字的絕對(duì)值。始終返回不帶MinusSign字符的負(fù)數(shù)。返回不帶PlusSign字符的正數(shù)。與“ +”格式代碼(“-+”)結(jié)合使用時(shí),將返回帶有加號(hào)的正數(shù),沒(méi)有符號(hào)的負(fù)數(shù)。此代碼不能與“ P”格式代碼一起使用;嘗試這樣做會(huì)導(dǎo)致<SYNTAX>錯(cuò)誤。 |
, |
返回帶有當(dāng)前語(yǔ)言環(huán)境的NumericGroupSeparator屬性值的數(shù)字,該數(shù)字在小數(shù)點(diǎn)左側(cè)的每個(gè)NumericGroupSize數(shù)字處插入。將“,”與“?!?/code>組合或 |
. |
無(wú)論當(dāng)前的語(yǔ)言環(huán)境設(shè)置如何,都使用標(biāo)準(zhǔn)的歐洲格式返回?cái)?shù)字。將DecimalSeparator設(shè)置為逗號(hào)(,),將NumericGroupSeparator設(shè)置為句點(diǎn)(。),將NumericGroupSize設(shè)置為3,將PlusSign設(shè)置為加號(hào)(+),將MinusSign設(shè)置為減號(hào)(-)。結(jié)合“?!?/code>帶有 |
D |
$DOUBLE特殊格式。此代碼有兩個(gè)效果:“D”指定$DOUBLE(-0)應(yīng)返回-0;否則,$DOUBLE(-0)返回0。但是,“-D”覆蓋負(fù)號(hào)并返回0??梢詾樵摯a指定“D”或“d”;返回的INF或NaN將以相應(yīng)的大寫或小寫字母表示。默認(rèn)值為大寫。 |
E |
電子記數(shù)法(科學(xué)記數(shù)法)。返回以科學(xué)記數(shù)法表示的數(shù)字。如果省略小數(shù)位數(shù),則使用6作為默認(rèn)值??梢詾榇舜a指定“E”或“e”;返回值將包含相應(yīng)的大寫或小寫符號(hào)。除非需要三位指數(shù)數(shù)字,否則返回值的指數(shù)部分長(zhǎng)度為兩位數(shù)字,并帶有前導(dǎo)符號(hào)。“E”和“G”不兼容,導(dǎo)致<FUNCTION>錯(cuò)誤。 |
G |
E表示法或固定的十進(jìn)制表示法。如果轉(zhuǎn)換為科學(xué)計(jì)數(shù)法所得的小數(shù)位數(shù)大于十進(jìn)制值(或默認(rèn)值為6個(gè)十進(jìn)制數(shù)字),則以科學(xué)計(jì)數(shù)法返回該數(shù)字。例如,, $FNUMBER(1234.99,"G",2)返回1.23E + 03。如果轉(zhuǎn)換為科學(xué)計(jì)數(shù)法所得的小數(shù)位數(shù)等于或小于十進(jìn)制值(或默認(rèn)為6個(gè)十進(jìn)制數(shù)字),則以固定的十進(jìn)制(標(biāo)準(zhǔn))表示法返回該數(shù)字。例如 $FNUMBER(1234.99,"G",3)返回1235??梢詾榇舜a指定“ G”或“ g”;返回的科學(xué)計(jì)數(shù)值將包含相應(yīng)的大寫字母“ E”或小寫字母“ e”。 “ E”和“ G”不兼容,并導(dǎo)致錯(cuò)誤。 |
L |
前導(dǎo)標(biāo)志。如果存在符號(hào),則符號(hào)必須在inumber的數(shù)字部分之前。不允許使用括號(hào)。此代碼不能與“ P”或“ T”格式代碼一起使用;嘗試這樣做會(huì)導(dǎo)致或錯(cuò)誤。前導(dǎo)符號(hào)是默認(rèn)格式。 |
N |
沒(méi)有NumericGroupSeparator。不允許使用數(shù)字組分隔符。此格式代碼與逗號(hào)(,)格式代碼不兼容。與點(diǎn)格式代碼(“N”)一起使用時(shí),數(shù)字的格式使用歐洲小數(shù)分隔符,但不使用數(shù)字組分隔符。前導(dǎo)符號(hào)是默認(rèn)格式。 |
O |
ODBC區(qū)域設(shè)置。覆蓋當(dāng)前區(qū)域設(shè)置,而使用具有下列值的標(biāo)準(zhǔn)ODBC區(qū)域設(shè)置:PlusSign=+;MinusSign=-;DecimalSeparator=.;NumericGroupSeparator=,;NumericGroupSize=3.就其本身而言,“O”格式的代碼只使用ODBC MinusSign和DecimalSeparator。此格式代碼與點(diǎn)(.)不兼容。格式化代碼。當(dāng)與逗號(hào)格式代碼(“O,”)一起使用時(shí),數(shù)字使用ODBC小數(shù)分隔符和ODBC數(shù)字組分隔符進(jìn)行格式化。 |
P |
括號(hào)符號(hào)。返回括號(hào)中沒(méi)有前導(dǎo)MinusSign區(qū)域設(shè)置屬性值的負(fù)數(shù)。否則,它返回不帶括號(hào)但帶有前導(dǎo)和尾隨空格字符的數(shù)字。此代碼不能與“+”、“-”、“L”或“T”格式代碼一起使用;嘗試這樣做會(huì)導(dǎo)致<SYNTAX>錯(cuò)誤。 |
T |
尾部標(biāo)志。如果否則會(huì)生成前綴符號(hào),則返回帶有尾隨符號(hào)的數(shù)字。但是,它不會(huì)強(qiáng)制使用尾隨標(biāo)志。要為非負(fù)數(shù)(正數(shù)或零)生成尾號(hào),還必須指定“+”格式代碼。要為負(fù)數(shù)生成尾號(hào),不能指定“-”格式代碼。使用的尾號(hào)分別由當(dāng)前區(qū)域設(shè)置的PlusSign和MinusSign屬性確定。在省略“+”的非負(fù)數(shù)或指定了“-”的負(fù)數(shù)的情況下,插入尾隨空格字符,但不插入符號(hào)。不允許使用括號(hào)。此代碼不能與“L”或“P”格式代碼一起使用;嘗試這樣做會(huì)導(dǎo)致<SYNTAX>或<Function>錯(cuò)誤。 |
在Caché中,小于1的小數(shù)以不帶零整數(shù)的Caché規(guī)范形式表示:0.66變?yōu)?code>.66。這是$FNUMBER的默認(rèn)值。但是,大多數(shù)$FNUMBER FORMAT選項(xiàng)返回小于1的帶有前導(dǎo)零整數(shù)的小數(shù):.66變?yōu)?code>0.66。兩參數(shù)$FNUMBER,其格式為“”(空字符串),“ L”(在功能上與空字符串相同)和“ D”以標(biāo)準(zhǔn)形式返回小于1的小數(shù):.66。所有其他兩參數(shù)$FNUMBER格式選項(xiàng)和所有三參數(shù)$FNUMBER格式選項(xiàng)都返回小于1的小數(shù),并帶有單個(gè)前導(dǎo)零整數(shù):000.66或.66都變?yōu)?code>0.66。這是JSON數(shù)字的小數(shù)數(shù)字格式。
$DOUBLE函數(shù)可以返回值INF(無(wú)限)和NAN(不是數(shù)字)。 INF可能帶有負(fù)號(hào);格式代碼將INF表示為數(shù)字。例如:+ INF,INF-,(INF)。 NAN不帶標(biāo)志;影響NAN的唯一格式代碼是“ d”,它以小寫字母返回。 “ E”和“ G”代碼對(duì)INF和NAN值沒(méi)有影響。
decimal
十進(jìn)制參數(shù)指定要包含在返回值中的小數(shù)位數(shù)。將十進(jìn)制指定為正整數(shù),或者將任何有效的ObjectScript變量或表達(dá)式指定為正整數(shù)。如果十進(jìn)制為負(fù)數(shù),則Caché會(huì)將其視為0值。如果十進(jìn)制是小數(shù),則Caché會(huì)截?cái)酁檎麛?shù)部分。
- 如果小數(shù)大于inumber中的小數(shù)位數(shù),則其余位置將填充零。
- 如果小數(shù)小于inumber中的小數(shù)位數(shù),則Caché將inumber舍入為適當(dāng)?shù)男?shù)位數(shù)。
- 如果十進(jìn)制為0,則inumber作為不帶小數(shù)點(diǎn)分隔符的整數(shù)返回。 Caché將inumber舍入為適當(dāng)?shù)恼麛?shù)。
如果inumber小于1且十進(jìn)制大于0,則$FNUMBER始終在小數(shù)點(diǎn)分隔符前的整數(shù)位置返回單個(gè)零,而不考慮格式值。小數(shù)的這種表示形式不同于Caché規(guī)范形式。
舍入后,可以指定十進(jìn)制參數(shù)來(lái)控制返回的小數(shù)位數(shù)。例如,假設(shè)變量c包含數(shù)字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
第一個(gè)$FNUMBER返回+6.252,第二個(gè)返回+6.25198000。
示例
以下示例顯示不同的格式指定如何影響$FNUMBER的行為。這些示例假定當(dāng)前區(qū)域設(shè)置為默認(rèn)區(qū)域設(shè)置。
下面的示例顯示符號(hào)代碼對(duì)正數(shù)的影響:
/// 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+
下面的示例顯示符號(hào)代碼對(duì)負(fù)數(shù)的影響:
/// 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”格式代碼對(duì)正數(shù)和負(fù)數(shù)的影響。此示例在數(shù)字前后分別寫入星號(hào),以表明返回的正數(shù)帶有前導(dǎo)空格和尾隨空格:
DHC-APP>WRITE "*",$FNUMBER(-123,"P"),"*",!
*(123)*
DHC-APP> WRITE "*",$FNUMBER(123,"P"),"*",!
* 123 *
下面的示例返回1,234,567.81。 “,”格式以美國(guó)格式返回x,插入逗號(hào)作為數(shù)字組分隔符,并使用句點(diǎn)作為小數(shù)點(diǎn)分隔符:
DHC-APP>SET x=1234567.81
DHC-APP>WRITE $FNUMBER(x,",")
1,234,567.81
下面的示例返回1.234.567,81。 “?!?/code> format以歐洲格式返回x,插入句點(diǎn)作為數(shù)字組分隔符,并插入逗號(hào)作為十進(jìn)制分隔符:
DHC-APP>SET x=1234567.81
DHC-APP>WRITE $FNUMBER(x,".")
1.234.567,81
以下3參數(shù)示例返回124,329.00。 $FNUMBER插入一個(gè)逗號(hào)作為數(shù)字組分隔符,添加一個(gè)句點(diǎn)作為十進(jìn)制分隔符,并在x的值后附加兩個(gè)零作為小數(shù)位。
DHC-APP>SET x=124329
DHC-APP>WRITE $FNUMBER(x,",",2)
124,329.00
以下3參數(shù)示例返回124329.00。省略的格式由占位符逗號(hào)表示;十進(jìn)制將兩個(gè)零作為小數(shù)位附加到x的值。
DHC-APP>SET x=124329
DHC-APP>WRITE $FNUMBER(x,"",2)
124329.00
以下3參數(shù)示例返回0.78。省略的格式由占位符逗號(hào)表示;十進(jìn)制舍入到2個(gè)小數(shù)位;十進(jìn)制還會(huì)附加整數(shù)0,覆蓋默認(rèn)格式:
DHC-APP>SET x=.7799
DHC-APP>WRITE $FNUMBER(x,"",2)
0.78
負(fù)小數(shù)
/// 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)
正小數(shù)
/// 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
注意:格式“-” 絕對(duì)值 “N” 小數(shù),整數(shù)部分添加0,“T” 尾部添加操作符。
“E”科學(xué)計(jì)數(shù)法,“”與“L”相同
注意
小數(shù)點(diǎn)分隔符
$FNUMBER使用當(dāng)前區(qū)域設(shè)置(“.”)的DecimalSeparator屬性值。默認(rèn)情況下)作為返回?cái)?shù)字的整數(shù)部分和小數(shù)部分之間的分隔符。當(dāng)“?!?/code>如果指定了格式代碼,則無(wú)論當(dāng)前區(qū)域設(shè)置如何,此分隔符都是“,”。
若要確定區(qū)域設(shè)置的DecimalSeparator字符,請(qǐng)調(diào)用GetFormatItem()方法:
DHC-APP>WRITE ##class(%SYS.NLS.Format).GetFormatItem("DecimalSeparator")
.
數(shù)字分組分隔符和大小
當(dāng)格式字符串包含“”時(shí),$FNUMBER使用當(dāng)前區(qū)域設(shè)置中的NumericGroupSeparator屬性值作為返回?cái)?shù)字整數(shù)部分的數(shù)字組之間的分隔符。這些組的大小由當(dāng)前區(qū)域設(shè)置的NumericGroupSize屬性確定。
英語(yǔ)語(yǔ)言環(huán)境默認(rèn)為逗號(hào)(“,”)作為NumericGroupSeparator,3作為NumericGroupSize。許多歐洲地區(qū)使用句點(diǎn)(“.”)。作為NumericGroupSeparator。俄語(yǔ)(Rusw)、烏克蘭語(yǔ)(Ukrw)和捷克語(yǔ)(Csyw)區(qū)域設(shè)置使用空格作為NumericGroupSeparator。所有區(qū)域設(shè)置(包括日語(yǔ))的NumericGroupSize默認(rèn)為3。(日語(yǔ)用戶可能希望根據(jù)上下文將整數(shù)數(shù)字以3或4為單位進(jìn)行分組。)
當(dāng)格式字符串包含“.”時(shí)。(不包括“N”)$FNUMBER使用NumericGroupSeparator=“?!?/code>和NumericGroupSize=3來(lái)格式化返回值,而不考慮當(dāng)前的區(qū)域設(shè)置。
要確定區(qū)域設(shè)置的NumericGroupSeparator字符和NumericGroupSize編號(hào),請(qǐng)調(diào)用GetFormatItem()方法:
DHC-APP>WRITE ##class(%SYS.NLS.Format).GetFormatItem("NumericGroupSeparator"),!
,
DHC-APP>WRITE ##class(%SYS.NLS.Format).GetFormatItem("NumericGroupSize")
3
DHC-APP>
加號(hào)和減號(hào)
$FNUMBER使用當(dāng)前區(qū)域設(shè)置的PlusSign和MinusSign屬性值(默認(rèn)情況下為“+”和“-”)。當(dāng)“?!?/code>如果指定了格式代碼,則無(wú)論當(dāng)前區(qū)域設(shè)置如何,這些符號(hào)都將設(shè)置為“+”和“-”。
要確定區(qū)域設(shè)置的PlusSign和MinusSign字符,請(qǐng)調(diào)用GetFormatItem()方法:
DHC-APP>WRITE ##class(%SYS.NLS.Format).GetFormatItem("PlusSign")
+
DHC-APP>WRITE ##class(%SYS.NLS.Format).GetFormatItem("MinusSign")
-
$FNUMBER和$INUMBER之間的差異
大多數(shù)格式代碼在$FNUMBER和$INUMBER函數(shù)中具有相似的含義,但是由于執(zhí)行的驗(yàn)證和轉(zhuǎn)換的性質(zhì),每個(gè)代碼觸發(fā)的確切行為因函數(shù)而異。
特別是,“-”和“+”格式代碼對(duì)$FNUMBER的含義與對(duì)$INUMBER的含義完全不同。對(duì)于$FNUMBER,“-”和“+”不是互斥的,“-”僅影響MinusSign(通過(guò)抑制它),而“+”僅影響PlusSign(通過(guò)插入它)。對(duì)于$INUMBER,“-”和“+”是互斥的。 “-”表示不允許使用符號(hào),“ +”表示必須使用符號(hào)。