第十七章 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“-”“+”是互斥的。 “-”表示不允许使用符号,“ +”表示必须使用符号。

猜你喜欢

转载自blog.csdn.net/yaoxin521123/article/details/108440598