语言"/>
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// ew str
}
- 如果要在字符串中包含引号字符("),则需要两个“”,两个“”代表一个”
// 输出"
w """",!// 输出""
w """"""set str = "hello ""world"""
// 输出hello "world"
w str
- 不包含任何值的字符串称为空字符串。它由两个引号表示。空字符串被视为已定义的值,它的长度是0。空字符串和$c(0)不同,如下所示:
ClassMethod MyFunction()
{set str = ""// 输出0w "空字符串长度:"_$length(str),!set str = $c(0)// 输出1w "$c(0)字符串长度:"_$length(str)
}
- 可以使用连接运算符(_)将两个或多个字符串连接在一起。
// 输出helloworld!
w "hello"_"world"_"!"
- 可以使用等于(=)和不等于('=)运算符来比较两个字符串。字符串的比较区分大小写。如果字符串为数字,则只有包含规范形式的数字的字符串才等于其相应地数字(-0不是规范数字)
ClassMethod MyFunction()
{// 输出1w "hello" = "hello"// 输出0w "world" '= "world"// 输出0w "-8" = 8,!// 输出1w "8" = 008.00,!// 输出1w "-8" = -8// 输出0w "-0" = 0,!// 输出0w "-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()
{// 输出-200w -2E2,!// 输出-.02w -2E-2,!// 输出-200w -2E+2,!// 输出200w 2E+2,!// 输出.02w 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// 输出1w "数字长度:"_$length(x),!// 输出9w "数字值:"_x,!// 输出1w "是否与9相等:",x=9,!// 输出10w "+1:",x+1,!// 定义数字字符串set y = "0009.00"// 输出7w "数字长度:"_$length(y),!// 输出0009.00w "数字值:"_y,!// 输出0w "是否与9相等:",y=9,!// 输出10w "+1:",y+1,!//输出1w "003"+3 = 6,!//输出1w "++-3" + -3 = -6,!//输出1w "003" > 2,!//输出1w "++-003" >= -3
}
- 混合数字字符串:指的是以数字字符开头,后面跟一个或多个非数字字符的字符串。在进行数值或布尔运算时(等式运算除外),将会从前往后匹配,如果遇到不规范非数字字符,则停止匹配,后面的字符将会被忽略。
ClassMethod Command()
{// 输出24w "22 hello" + 2,!// 输出24w "+22/77" + 2,!// 输出24w "22.000" + 2,!// 输出24.5w "22.5.99" + 2,!// 输出24w "22.s.8" + 2,!
}
- 非数字字符串:指的是再遇到数字字符串之前,遇到的非数字字符串的任何字符串,空格也被视为非数字字符串。数值和布尔运算通常会将非数字字符串解析为数值0
ClassMethod MyFunction()
{// 输出1w +"8" = 8,!// 输出1w +"+0008" = 8,!// 输出1w +"8 num" = 8,!// 输出1w +"num" = 0,!// 输出1w +"" = 0,!
}
- 可以使用连接运算符(_)将多个数字连接起来。Cache会首先将每个数字转换为其规范形式,然后对结果执行字符串连接
ClassMethod MyFunction()
{// 输出1234w 12_34,!// 输出1234w 12_+34,!// 输出1234w 12_--34,!// 输出12.0134w 12.01_34,!// 输出.0134w 0.01_34,!// 输出1234.55w 12_0034.55,!// 输出12034w 12E1_34,!// 输出1212.3w 12_"12.3"
}
3.小数
- 默认情况下,Cache使用$decimal表示浮点小数。它提供最高级别的精度,保留19位。
ClassMethod MyFunction2()
{// 输出.3333333333333333333w 1/3,!// 输出.3333333333333333333w $decimal(1/3),!// NAN表示非数字,输出0w $decimal("NAN"),!// INF表示无穷大,输出0w $decimal("INF"),!
}
- $double表示双精度浮点小数。它的精度为53个二进制位,相等于只能保证小数后16位精度。支持特殊值INF(无穷大)和NAN(非数字)
ClassMethod MyFunction3()
{// 输出.33333333333333331482w $double(1/3),!// 输出NANw $double("NAN"),!// 输出INFw $double("INF"),!
}
从上面可以看出,在第17位时,开始不准确。
- Cache中,最大整数范围为:-9223372036854775808和9223372036854775807。如果对最大整数增加值,则会进行四舍五入,将低位数字替换为0
ClassMethod MyFunction4()
{// 输出9223372036854775810w 9223372036854775807+1,!// 输出9223372036854775830w 9223372036854775807+23,!// 输出9223372036854775830w 9223372036854775807+25,!// 输出1w (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.Objw 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// 输出trueif (num) {w "true",! }else{w "false",!}// 输出trueif 0.5 {w "true",! }else{w "false",!}// 输出trueif "1 num" {w "true",! }else{w "false",!}// 输出0w "007"=7,!// 输出0w "+007"=7,!// 输出1w +"007"=7,!// 输出falseif "num" {w "true",! }else{w "false",!}
}
6.日期
Global中的日期和时间都是以数字的形式存储的。
- ObjectScript没有内置的日期类型,但是它由很多函数,用于操作和格式化表示为字符串的日期值
- $horolog(缩写$h):包含了当前进程的本地日期和时间,以逗号(,)分隔。第一部分是日期的数字,它是从1840年12月31日开始计算的数字;第二部分是秒的数字,它是从午夜开始计算的。
ClassMethod MyFunction()
{// 输出66328,46923w $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 2set t2 = $zh// 输出2.000593
w t2 - t1
更多推荐
M语言
发布评论