第十七章 Caché 函數(shù)大全 $FNUMBER 函數(shù)

第十七章 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>組合或“ N”格式會(huì)導(dǎo)致錯(cuò)誤。
. 無(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>帶有“,”“ O”格式的文件會(huì)導(dǎo)致<FUNCTION>錯(cuò)誤。
D $DOUBLE特殊格式。此代碼有兩個(gè)效果:“D”指定$DOUBLE(-0)應(yīng)返回-0;否則,$DOUBLE(-0)返回0。但是,“-D”覆蓋負(fù)號(hào)并返回0??梢詾樵摯a指定“D”“d”;返回的INFNaN將以相應(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 MinusSignDecimalSeparator。此格式代碼與點(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è)置的PlusSignMinusSign屬性確定。在省略“+”的非負(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ù)字。例如:+ INFINF-,(INF)。 NAN不帶標(biāo)志;影響NAN的唯一格式代碼是“ d”,它以小寫字母返回。 “ E”“ G”代碼對(duì)INFNAN值沒(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è)置的PlusSignMinusSign屬性值(默認(rèn)情況下為“+”“-”)。當(dāng)“?!?/code>如果指定了格式代碼,則無(wú)論當(dāng)前區(qū)域設(shè)置如何,這些符號(hào)都將設(shè)置為“+”“-”。

要確定區(qū)域設(shè)置的PlusSignMinusSign字符,請(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)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容