第四十六章 Caché 函数大全 $NUMBER 函数

第四十六章 Caché 函数大全 $NUMBER 函数

验证并返回一个数值; (可选)提供舍入和范围检查。

大纲

$NUMBER(num,format,min,max)
$NUM(num,format,min,max)

参数

  • num 要验证的数值,然后将其转换为Caché规范形式。它可以是数字或字符串值,变量名或任何有效的ObjectScript表达式。
  • format 可选-指定要应用于num的处理选项。这些处理选项主要指示如何识别和处理包含小数点的数字。
  • min 可选-可接受的最小数值。
  • max 可选-可接受的最大数值。

描述

$NUMBER函数使用指定的格式转换并验证num数值。它接受以各种标点符号格式提供的数字,并以Caché规范形式返回数字。可以使用格式来测试数字是否为整数。如果指定了最小值或最大值,则数字必须在该值的范围内。.

$NUMBER可以用于美国格式编号,欧洲格式编号和俄语/捷克格式编号。

$DOUBLEINF-INFNAN上使用$NUMBER总是返回空字符串。

参数

format

可能的格式代码如下。这些格式代码可以以任何顺序指定。必须将非数字格式指定为带引号的字符串。以下任何或所有以下格式代码都可以省略。如果格式无效,则$NUMBER会生成<SYNTAX>错误。

  • 十进制字符:“。”“,”表示是否使用美国(“。”)或欧洲(“,”)惯例来验证小数点。可以指定这些字符,也可以不指定小数。如果省略小数字符,则数字采用当前语言环境的DecimalSeparator。
  • 舍入系数:一个整数,指示要舍入的位数。该整数前面可以有一个可选的+-号。如果舍入因子为正(或无符号),则将数字舍入为指定的小数位数。如果舍入因子为0,则数字舍入为整数。如果舍入因子是负整数,则将数字舍入到小数点分隔符左侧的指定位数。例如,舍入因子-2234.45舍入为200。数字“ 5”总是四舍五入;数字“5”总是四舍五入。因此,舍入因子1会将123.45舍入为123.5
  • 整数指示符:字母“I”(大写或小写),指定数字必须解析为整数。例如,–07.00解析为整数,但–07.01解析为整数。如果数字不能解析为整数,则$NUMBER返回空字符串。在下面的示例中,仅前三个$NUMBER函数返回一个整数。其他三个返回空字符串:

I:参数可以判断是否为整数

/// d ##class(PHA.TEST.Function).NUMBER()
ClassMethod NUMBER()
{
   
    WRITE $NUMBER(-07.00,"I"),"  non-canonical integer numeric",!
    WRITE $NUMBER(+"-07.00","I")," string forced as integer numeric",!
    WRITE $NUMBER("-7","I")," canonical integer string numeric",!
    WRITE $NUMBER("-07.00","I")," non-canonical integer string numeric",!
    WRITE $NUMBER(-07.01,"I")," fractional numeric",!
    WRITE $NUMBER("-07.01","I")," fractional string numeric",!
}
DHC-APP>d ##class(PHA.TEST.Function).NUMBER()
-7  non-canonical integer numeric
-7 string forced as integer numeric
-7 canonical integer string numeric
 non-canonical integer string numeric
 fractional numeric
 fractional string numeric
 

min and max

可以指定最小允许值,最大允许值,或两者都不指定。如果指定,则num值(四舍五入后)必须大于或等于最小值,并且小于或等于最大值。空字符串作为最小值或最大值等于零。如果值不满足这些条件,则$NUMBER返回空字符串。

因此,在以下示例中,第一个有效,因为num(4.0)等于max(4)。第二个有效,因为num(4.003)在格式范围内(两个小数位数)仍等于max(4)。但是,第三个无效,因为$NUMBER在格式范围内将num向上舍入为大于max的值(4.01)。它返回一个空字符串。


/// d ##class(PHA.TEST.Function).NUMBER1()
ClassMethod NUMBER1()
{
    WRITE !,$NUMBER(4.0,2,0,4)
    WRITE !,$NUMBER(4.003,2,0,4)
    WRITE !,$NUMBER(4.006,2,0,4)
}
DHC-APP>d ##class(PHA.TEST.Function).NUMBER1()
 
4
4
 

可以省略参数,将逗号保留为占位符。以下示例的第一行设置最大值,但不设置格式或最小值。第二行没有设置格式值,但是设置了空字符串的最小值,它等于零。因此,第一行返回–7,第二行不符合最小条件,并返回空字符串。

/// d ##class(PHA.TEST.Function).NUMBER2()
ClassMethod NUMBER2()
{
    SET max=10
    WRITE !,$NUMBER(-7,,,max)
    WRITE !,$NUMBER(-7,,"",max)
}
DHC-APP>d ##class(PHA.TEST.Function).NUMBER2()
 
-7
 

不能指定结尾的逗号。以下结果导致错误:

DHC-APP> WRITE $NUMBER(mynum,,min,)
 
 WRITE $NUMBER(mynum,,min,)
 ^
<SYNTAX>

注意

操作顺序

$NUMBER执行以下一系列转换和验证。如果该数字未通过任何验证步骤,则$NUMBER返回空字符串(“”)。如果该数字通过所有验证步骤,则$NUMBER将返回转换后的Caché规范格式数字。

  1. $NUMBER使用十进制字符格式来确定哪个字符是组分隔符,并去除所有组分隔符(无论它们在数字中的位置如何)。它使用以下规则:如果格式中指定的十进制字符为句点(),则组分隔符为逗号()或空格。如果格式中指定的十进制字符是逗号(),则组分隔符是句点()或空格。如果未以格式指定小数字符,则组分隔符是当前语言环境的NumericGroupSeparator属性。 (俄语(rusw),乌克兰语(ukrw)和捷克语(csyw)语言环境使用空格作为数字组分隔符。)
  2. $NUMBER验证数字是否格式正确。格式正确的数字可以包含以下任意一项:
  • 数字
  • 如上定义的可选十进制指示符(一个或一个,但不超过一个)。
  • 可选的加号(+)或减号(-)(前导或结尾,但不能超过一个)。
  • 可选括号括住数字以指示负值。括号中的数字不能带有符号字符。
  • 可选的以10为底的指数,由“E”(大写或小写)后跟一个整数表示。如果指定“E”,则必须存在一个指数整数。指数整数之前可以带有符号字符。
  1. 如果整数指示符以格式显示,则$NUMBER检查整数。整数不能包含小数点指示符。数字字符串(“123.45”)和数字(123.45)的解析方式不同。即使十进制指示符后面没有数字,或者科学计数法或四舍五入的扩展将消除小数位,数字字符串也无法通过此整数测试。数字通过了这些验证测试。如果数字未通过整数指示符检查,则$NUMBER返回空字符串(“”)。
  2. $NUMBER将数字转换为Caché规范格式的数字。它扩展了科学计数法,用负号字符替换了括号,删除了前导和尾随的零,并删除了一个十进制指示符(如果后面没有任何非零数字)。
  3. $NUMBER使用舍入因子(如果存在)将数字舍入为指定的位数。然后,如果没有任何数字,它将去除所有前导或尾随零以及小数点指示符。
  4. $NUMBER根据指定的最小值验证数字。
  5. $NUMBER根据指定的最大值验证数字。
  6. $NUMBER返回结果数。

欧美十进制分隔符

$NUMBER以规范形式返回数字,删除所有数字组分隔符,并最多包含一个小数分隔符。您可以使用格式值“”或“”标识num中使用的小数点分隔符;通过指定小数点分隔符,还隐式指定了数字组分隔符。

若要确定您的语言环境的DecimalSeparator字符,请调用以下方法:

DHC-APP>WRITE ##class(%SYS.NLS.Format).GetFormatItem("DecimalSeparator")
.

若要确定语言环境的NumericGroupSeparator字符和NumericGroupSize号,请调用以下方法:

DHC-APP> WRITE ##class(%SYS.NLS.Format).GetFormatItem("NumericGroupSeparator")
,
DHC-APP>WRITE ##class(%SYS.NLS.Format).GetFormatItem("NumericGroupSize")
3

在以下示例中,将逗号指定为小数点分隔符:

/// d ##class(PHA.TEST.Function).NUMBER3()
ClassMethod NUMBER3()
{
    SET num="123,456"
    WRITE !,$NUMBER(num,",")  
    // 转换为分数“ 123.456”
    // (逗号被标识为小数点分隔符)
    SET num="123,45,6"
    WRITE !,$NUMBER(num,",")  
    // 返回空字符串
    // (无效的数字,小数点分隔符过多)
    SET num="123.456"
    WRITE !,$NUMBER(num,",")
    // 转换为整数“ 123456”
    // 删除组分隔符
    // (如果逗号为小数,则句点为组分隔符)
    SET num="123.4.56.78"
    WRITE !,$NUMBER(num,",")  
    // 转换为整数“ 123456”
    // 删除组分隔符
    // (组分隔符的数量和位置被忽略)
}
DHC-APP>d ##class(PHA.TEST.Function).NUMBER3()
 
123.456
 
123456
12345678

舍入和精度

四舍五入数字时,请注意IEEE浮点数和标准Caché分数数字的精度不同。 $DOUBLE IEEE浮点数使用二进制表示法编码。它们的精度为53个二进制位,对应于精度为15.95的十进制数字。 (请注意,二进制表示形式并不完全对应于十进制小数。)由于大多数十进制分数不能完全以该二进制表示法来表示,因此IEEE浮点数可能与相应的标准Caché浮点数略有不同。在所有受支持的Caché系统平台上,标准Caché小数数字的精度为18个十进制数字。当IEEE浮点数显示为小数时,二进制位通常会转换为具有远远超过18个十进制数字的小数。这并不意味着IEEE浮点数比标准Caché分数数字更精确。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342