M语言-数据类型

 

目录

1.字符串

2.数字

3.小数

4.对象

5.布尔类型

6.日期


        Cache ObjectScript是一种无类型语言,不必声明变量的类型。任何变量都可以有字符串、数值或对象值。

1.字符串

  • 最大字符串大小是可配置的。默认情况下启用长字符串,长字符串的最大字符串大小是3641144个字符,否则最大字符串大小为32767个字符。可在Management Portal的【系统管理】-【配置】-【系统配置】-【内存和启动】里面配置是否启用长字符串
// 输出字符串的最大长度
w $system.SYS.MaxLocalLength()
  • 字符串可以包含任何字符,包括空格和控制字符。
  • 字符串长度指的是字符数,而不是字节数
// 输出11
w $length("hello world")
  • 可以使用$c($char缩写),来指定不可输入的字符
ClassMethod MyFunction10()
{
	set str = "abc"
	/// zzdump输出Ascall码
	zzdump str
	
	/// $c(0)代表空,$c(9)代表tab建(制表符),$c(10)代表换行,$c(13)代表回车
	w "",!
	set str = "a"_$c(0)_"bb"_$c(9)_"c"_$c(10)_"d"_$c(13)_"e"
 
    // 输出结果为:a bb	   c
    //            d
    //            e
	w str
}
  • 如果要在字符串中包含引号字符("),则需要两个“”,两个“”代表一个”
// 输出"
w """",!
 
// 输出""
w """"""

set str = "hello ""world"""
// 输出hello "world"
w str
  • 不包含任何值的字符串称为空字符串。它由两个引号表示。空字符串被视为已定义的值,它的长度是0。空字符串和$c(0)不同,如下所示:
ClassMethod MyFunction()
{
	set str = ""
	// 输出0
	w "空字符串长度:"_$length(str),!
	
	set str = $c(0)
	// 输出1
	w "$c(0)字符串长度:"_$length(str)
}
  • 可以使用连接运算符(_)将两个或多个字符串连接在一起。
// 输出helloworld!
w "hello"_"world"_"!"
  • 可以使用等于(=)和不等于('=)运算符来比较两个字符串。字符串的比较区分大小写。如果字符串为数字,则只有包含规范形式的数字的字符串才等于其相应地数字(-0不是规范数字)
ClassMethod MyFunction()
{
	// 输出1
    w "hello" = "hello"

    // 输出0
    w "world" '= "world"

    // 输出0
    w "-8" = 8,!
    // 输出1
    w "8" = 008.00,!
    // 输出1
    w "-8" = -8

    // 输出0
    w "-0" = 0,!
    // 输出0
	w "-0" = -0
}
  • >、<、<=、或>=运算符不能用于字符串的比较。这些运算符将字符串视为数字,并始终执行数字比较。使用这些运算符进行比较时,将任何非数字字符串分配数值0
// 输出0
w "x" > 1
// 输出1
w "2x" > 1
// 输出0
w "x2x" > 1

2.数字

  • 数字前面和后面可以加0
// 输出9
w 0009.00
  • 字母E,用于科学计数法:
// 输出 35000000000
w 3.5E10
  • 数字前面可以加+和-。但是不能出现在除了科学计数法E之外的其他字符的后面
ClassMethod MyFunction14()
{
    // 输出-200
	w -2E2,!
    // 输出-.02
	w -2E-2,!
    // 输出-200
	w -2E+2,!
    // 输出200
	w 2E+2,!
    // 输出.02
	w 2E-2,!
}
  • Cache将数字转换为规范形式时,会将数字前面和后面的0去掉。使用$fn和$justify,将去掉的0恢复,并可以指定保留几位小数
// 输出.066
w 0.066000,!
	
//使用$fn和$justify,将去掉的0恢复,并可以指定保留几位小数
// 输出0.066
w $fn(.066, "N", 3),!
// 输出0.0660
w $justify(.066, "N", 4)
  • 对于算术运算、大于/小于运算,如果字符串是规范形式的数字,则在功能上与相应地数字相同
ClassMethod Number()
{
	set x = 0009.00
    // 输出1
	w "数字长度:"_$length(x),!
	// 输出9
	w "数字值:"_x,!
	// 输出1
	w "是否与9相等:",x=9,!
	// 输出10
	w "+1:",x+1,!
	
    // 定义数字字符串
	set y = "0009.00"
	// 输出7
	w "数字长度:"_$length(y),!
	// 输出0009.00
	w "数字值:"_y,!
	// 输出0
	w "是否与9相等:",y=9,!
	// 输出10
	w "+1:",y+1,!


    //输出1
    w "003"+3 = 6,!
    //输出1
	w "++-3" + -3 = -6,!
	
    //输出1
	w "003" > 2,!
    //输出1
	w "++-003" >= -3
}

  • 混合数字字符串:指的是以数字字符开头,后面跟一个或多个非数字字符的字符串。在进行数值或布尔运算时(等式运算除外),将会从前往后匹配,如果遇到不规范非数字字符,则停止匹配,后面的字符将会被忽略。
ClassMethod Command()
{
	// 输出24
	w "22 hello" + 2,!
	
	// 输出24
	w "+22/77" + 2,!
	
	// 输出24
	w "22.000" + 2,!
	
	// 输出24.5
	w "22.5.99" + 2,!
	
	// 输出24
	w "22.s.8" + 2,!
}
  • 非数字字符串:指的是再遇到数字字符串之前,遇到的非数字字符串的任何字符串,空格也被视为非数字字符串。数值和布尔运算通常会将非数字字符串解析为数值0
ClassMethod MyFunction()
{
	// 输出1
	w +"8" = 8,!
	
	// 输出1
	w +"+0008" = 8,!
	
	// 输出1
	w +"8 num" = 8,!
	
	// 输出1
	w +"num" = 0,!
	
	// 输出1
	w +"" = 0,!
}
  • 可以使用连接运算符(_)将多个数字连接起来。Cache会首先将每个数字转换为其规范形式,然后对结果执行字符串连接
ClassMethod MyFunction()
{
	// 输出1234
	w 12_34,!
	
	// 输出1234
	w 12_+34,!
	
	// 输出1234
	w 12_--34,!
	
	// 输出12.0134
	w 12.01_34,!
	
	// 输出.0134
	w 0.01_34,!
	
	// 输出1234.55
	w 12_0034.55,!
	
	// 输出12034
	w 12E1_34,!

    // 输出1212.3
	w 12_"12.3"
}

3.小数

  • 默认情况下,Cache使用$decimal表示浮点小数。它提供最高级别的精度,保留19位。
ClassMethod MyFunction2()
{
	// 输出.3333333333333333333
	w 1/3,!
	
	// 输出.3333333333333333333
	w $decimal(1/3),!
	
	// NAN表示非数字,输出0
	w $decimal("NAN"),!
	
	// INF表示无穷大,输出0
	w $decimal("INF"),!
}
  • $double表示双精度浮点小数。它的精度为53个二进制位,相等于只能保证小数后16位精度。支持特殊值INF(无穷大)和NAN(非数字)
ClassMethod MyFunction3()
{
	// 输出.33333333333333331482
	w $double(1/3),!
	
	// 输出NAN
	w $double("NAN"),!
	
	// 输出INF
	w $double("INF"),!
}

        从上面可以看出,在第17位时,开始不准确。

 

  • Cache中,最大整数范围为:-9223372036854775808和9223372036854775807。如果对最大整数增加值,则会进行四舍五入,将低位数字替换为0
ClassMethod MyFunction4()
{
	// 输出9223372036854775810
	w 9223372036854775807+1,!
	
	// 输出9223372036854775830
	w 9223372036854775807+23,!
	
	// 输出9223372036854775830
	w 9223372036854775807+25,!
	
	// 输出1
	w (9223372036854775807+23)=(9223372036854775807+25),!
}

4.对象

  • 通过%New命令,定义一个对象
Class Demo.Obj Extends %RegisteredObject
{

Property Name As %String;

/// d ##class(Demo.Obj).Command()
ClassMethod Command()
{
	// 定义对象,将对象的引用给obj变量
	set obj = ##class(Obj).%New()
	
    // 输出15@Demo.Obj
	w obj,!
}

}
  • 使用$isobject判断是否为对象
// 输出1
w $isobject(obj)

// 输出0
w $isObject("123")
  • 定义多个同一个对象时,会产生增加对象的内部引用计数
set obj = ##class(Obj).%New()
// 输出16@Demo.Obj
w obj,!
	
set obj2 = ##class(Obj).%New()
// 输出16@Demo.Obj
w obj2,!

/* 输出如下:
obj=<OBJECT REFERENCE>[15@Demo.Obj]
+----------------- general information ---------------
|      oref value: 16
|      class name: Demo.Obj
| reference count: 2
+----------------- attribute values ------------------
|               Name = ""
+-----------------------------------------------------
*/
zw obj2
  • 当对象的引用数量为0时,Cache会自动销毁该对象(调用%OnClose()方法,并将其从内存中移除)。OnClose()方法如下:
/// This callback method is invoked by the <METHOD>%Close</METHOD> method to 
/// provide notification that the current object is being closed.
/// 
/// <P>The return value of this method is ignored.
Method %OnClose() As %Status [ Private, ServerOnly = 1 ]
{
	Quit $$$OK
}

5.布尔类型

        在M语言中,布尔类型为1(true)和0(false)

ClassMethod MyFunction()
{
	set num = 1
	// 输出true
	if (num) {
		w "true",!	
	}else{
		w "false",!
	}
	
	// 输出true
	if 0.5 {
		w "true",!	
	}else{
		w "false",!
	}
	
	// 输出true
	if "1 num" {
		w "true",!	
	}else{
		w "false",!
	}
	
	// 输出0
	w "007"=7,!
	
	// 输出0
	w "+007"=7,!
	
	// 输出1
	w +"007"=7,!
	
	// 输出false
	if "num" {
		w "true",!	
	}else{
		w "false",!
	}
}

6.日期

        Global中的日期和时间都是以数字的形式存储的。

  • ObjectScript没有内置的日期类型,但是它由很多函数,用于操作和格式化表示为字符串的日期值
  • $horolog(缩写$h):包含了当前进程的本地日期和时间,以逗号(,)分隔。第一部分是日期的数字,它是从1840年12月31日开始计算的数字;第二部分是秒的数字,它是从午夜开始计算的。
ClassMethod MyFunction()
{
	// 输出66328,46923
	w $horolog,!
}
  • $now:返回当前日期的本地日期和时间,以小数秒为单位
// 输出66328,51253.643677
w $now(),!
  • $zdate(缩写$zd):验证日期,并将其从数字格式转换为显示指定的日期格式
  • $zdateh(缩写$zdh):将日期格式转换为时间格式

$zd(日期数字,格式)->日期

$zdh(日期,格式) -> 数字

// 输出08/07/2022
w $zdate($horolog),!
// 输出2022-08-07
w $zd($horolog, 3),!


// 输出66328
w $zdateh("08/07/2022"),!
// 输出66328
w $zdh("2022-08-07", 3),!
// T表示当天, 输出66328
w $zdh("T", 5),!
  • $ztime(缩写$zt):验证时间,并将其从数字格式转换为显示指定的时间格式
  • $ztimeh(缩写$zth):将时间格式转换为时间格式

$zt(时间数字,格式)->时间

$zth(时间,格式) -> 数字

// 输出14:27:02
w $ztime($p($horolog, ",", 2)),!
	// 输出02:27:02PM
w $zt($p($horolog, ",", 2), 3),!


// 输出52022
w $ztimeh("14:27:02"),!
// 输出52022
w $zth("02:27:02PM", 3),!
  • $zdatetime(缩写$zdt):验证日期和时间,将数字转换为日期和时间

$zdt(日期和时间数字,格式)->日期和时间

$zdth(日期和时间,格式) ->日期和时间数字

// 输出08/07/2022 14:33:36
w $zdatetime($h),!
// 输出2022-08-07 14:33:36
w $zdt($h, 3),!

// 输出66328,52416
w $zdatetimeh("08/07/2022 14:33:36"),!
// 输出66328,52416
w $zdatetimeh("2022-08-07 14:33:36", 3),!
// 输出66328,0
w $zdth("T", 5),!
  • $zhorolog(缩写$zh):返回启动Cache库以来,经过的秒数。
// 输出101268.602726
w $zhorolog,!
	
// 输出28.13016890888888889
w $zhorolog/3600,!

        $zhorolog还可以用于计算程序运行的时间:

set t1 = $zh
	
//等待2秒钟
hang 2
	
set t2 = $zh
	
// 输出2.000593
w t2 - t1

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luckyliuqs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值