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