• M语言-数据类型


     

    目录

    1.字符串

    2.数字

    3.小数

    4.对象

    5.布尔类型

    6.日期


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

    1.字符串

    • 最大字符串大小是可配置的。默认情况下启用长字符串,长字符串的最大字符串大小是3641144个字符,否则最大字符串大小为32767个字符。可在Management Portal的【系统管理】-【配置】-【系统配置】-【内存和启动】里面配置是否启用长字符串
    1. // 输出字符串的最大长度
    2. w $system.SYS.MaxLocalLength()
    • 字符串可以包含任何字符,包括空格和控制字符。
    • 字符串长度指的是字符数,而不是字节数
    1. // 输出11
    2. w $length("hello world")
    • 可以使用$c($char缩写),来指定不可输入的字符
    1. ClassMethod MyFunction10()
    2. {
    3. set str = "abc"
    4. /// zzdump输出Ascall码
    5. zzdump str
    6. /// $c(0)代表空,$c(9)代表tab建(制表符),$c(10)代表换行,$c(13)代表回车
    7. w "",!
    8. set str = "a"_$c(0)_"bb"_$c(9)_"c"_$c(10)_"d"_$c(13)_"e"
    9. // 输出结果为:a bb c
    10. // d
    11. // e
    12. w str
    13. }
    • 如果要在字符串中包含引号字符("),则需要两个“”,两个“”代表一个”
    1. // 输出"
    2. w """",!
    3. // 输出""
    4. w """"""
    5. set str = "hello ""world"""
    6. // 输出hello "world"
    7. w str
    • 不包含任何值的字符串称为空字符串。它由两个引号表示。空字符串被视为已定义的值,它的长度是0。空字符串和$c(0)不同,如下所示:
    1. ClassMethod MyFunction()
    2. {
    3. set str = ""
    4. // 输出0
    5. w "空字符串长度:"_$length(str),!
    6. set str = $c(0)
    7. // 输出1
    8. w "$c(0)字符串长度:"_$length(str)
    9. }
    • 可以使用连接运算符(_)将两个或多个字符串连接在一起。
    1. // 输出helloworld!
    2. w "hello"_"world"_"!"
    • 可以使用等于(=)和不等于('=)运算符来比较两个字符串。字符串的比较区分大小写。如果字符串为数字,则只有包含规范形式的数字的字符串才等于其相应地数字(-0不是规范数字)
    1. ClassMethod MyFunction()
    2. {
    3. // 输出1
    4. w "hello" = "hello"
    5. // 输出0
    6. w "world" '= "world"
    7. // 输出0
    8. w "-8" = 8,!
    9. // 输出1
    10. w "8" = 008.00,!
    11. // 输出1
    12. w "-8" = -8
    13. // 输出0
    14. w "-0" = 0,!
    15. // 输出0
    16. w "-0" = -0
    17. }
    • >、<、<=、或>=运算符不能用于字符串的比较。这些运算符将字符串视为数字,并始终执行数字比较。使用这些运算符进行比较时,将任何非数字字符串分配数值0
    1. // 输出0
    2. w "x" > 1
    3. // 输出1
    4. w "2x" > 1
    5. // 输出0
    6. w "x2x" > 1

    2.数字

    • 数字前面和后面可以加0
    1. // 输出9
    2. w 0009.00
    • 字母E,用于科学计数法:
    1. // 输出 35000000000
    2. w 3.5E10
    • 数字前面可以加+和-。但是不能出现在除了科学计数法E之外的其他字符的后面
    1. ClassMethod MyFunction14()
    2. {
    3. // 输出-200
    4. w -2E2,!
    5. // 输出-.02
    6. w -2E-2,!
    7. // 输出-200
    8. w -2E+2,!
    9. // 输出200
    10. w 2E+2,!
    11. // 输出.02
    12. w 2E-2,!
    13. }
    • Cache将数字转换为规范形式时,会将数字前面和后面的0去掉。使用$fn和$justify,将去掉的0恢复,并可以指定保留几位小数
    1. // 输出.066
    2. w 0.066000,!
    3. //使用$fn和$justify,将去掉的0恢复,并可以指定保留几位小数
    4. // 输出0.066
    5. w $fn(.066, "N", 3),!
    6. // 输出0.0660
    7. w $justify(.066, "N", 4)
    • 对于算术运算、大于/小于运算,如果字符串是规范形式的数字,则在功能上与相应地数字相同
    1. ClassMethod Number()
    2. {
    3. set x = 0009.00
    4. // 输出1
    5. w "数字长度:"_$length(x),!
    6. // 输出9
    7. w "数字值:"_x,!
    8. // 输出1
    9. w "是否与9相等:",x=9,!
    10. // 输出10
    11. w "+1:",x+1,!
    12. // 定义数字字符串
    13. set y = "0009.00"
    14. // 输出7
    15. w "数字长度:"_$length(y),!
    16. // 输出0009.00
    17. w "数字值:"_y,!
    18. // 输出0
    19. w "是否与9相等:",y=9,!
    20. // 输出10
    21. w "+1:",y+1,!
    22. //输出1
    23. w "003"+3 = 6,!
    24. //输出1
    25. w "++-3" + -3 = -6,!
    26. //输出1
    27. w "003" > 2,!
    28. //输出1
    29. w "++-003" >= -3
    30. }
    • 混合数字字符串:指的是以数字字符开头,后面跟一个或多个非数字字符的字符串。在进行数值或布尔运算时(等式运算除外),将会从前往后匹配,如果遇到不规范非数字字符,则停止匹配,后面的字符将会被忽略。
    1. ClassMethod Command()
    2. {
    3. // 输出24
    4. w "22 hello" + 2,!
    5. // 输出24
    6. w "+22/77" + 2,!
    7. // 输出24
    8. w "22.000" + 2,!
    9. // 输出24.5
    10. w "22.5.99" + 2,!
    11. // 输出24
    12. w "22.s.8" + 2,!
    13. }
    • 非数字字符串:指的是再遇到数字字符串之前,遇到的非数字字符串的任何字符串,空格也被视为非数字字符串。数值和布尔运算通常会将非数字字符串解析为数值0
    1. ClassMethod MyFunction()
    2. {
    3. // 输出1
    4. w +"8" = 8,!
    5. // 输出1
    6. w +"+0008" = 8,!
    7. // 输出1
    8. w +"8 num" = 8,!
    9. // 输出1
    10. w +"num" = 0,!
    11. // 输出1
    12. w +"" = 0,!
    13. }
    • 可以使用连接运算符(_)将多个数字连接起来。Cache会首先将每个数字转换为其规范形式,然后对结果执行字符串连接
    1. ClassMethod MyFunction()
    2. {
    3. // 输出1234
    4. w 12_34,!
    5. // 输出1234
    6. w 12_+34,!
    7. // 输出1234
    8. w 12_--34,!
    9. // 输出12.0134
    10. w 12.01_34,!
    11. // 输出.0134
    12. w 0.01_34,!
    13. // 输出1234.55
    14. w 12_0034.55,!
    15. // 输出12034
    16. w 12E1_34,!
    17. // 输出1212.3
    18. w 12_"12.3"
    19. }

    3.小数

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

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

     

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

    4.对象

    • 通过%New命令,定义一个对象
    1. Class Demo.Obj Extends %RegisteredObject
    2. {
    3. Property Name As %String;
    4. /// d ##class(Demo.Obj).Command()
    5. ClassMethod Command()
    6. {
    7. // 定义对象,将对象的引用给obj变量
    8. set obj = ##class(Obj).%New()
    9. // 输出15@Demo.Obj
    10. w obj,!
    11. }
    12. }
    • 使用$isobject判断是否为对象
    1. // 输出1
    2. w $isobject(obj)
    3. // 输出0
    4. w $isObject("123")
    • 定义多个同一个对象时,会产生增加对象的内部引用计数
    1. set obj = ##class(Obj).%New()
    2. // 输出16@Demo.Obj
    3. w obj,!
    4. set obj2 = ##class(Obj).%New()
    5. // 输出16@Demo.Obj
    6. w obj2,!
    7. /* 输出如下:
    8. obj=[15@Demo.Obj]
    9. +----------------- general information ---------------
    10. | oref value: 16
    11. | class name: Demo.Obj
    12. | reference count: 2
    13. +----------------- attribute values ------------------
    14. | Name = ""
    15. +-----------------------------------------------------
    16. */
    17. zw obj2
      • 当对象的引用数量为0时,Cache会自动销毁该对象(调用%OnClose()方法,并将其从内存中移除)。OnClose()方法如下:
      1. /// This callback method is invoked by the %Close method to
      2. /// provide notification that the current object is being closed.
      3. ///
      4. ///

        The return value of this method is ignored.

      5. Method %OnClose() As %Status [ Private, ServerOnly = 1 ]
      6. {
      7. Quit $$$OK
      8. }

      5.布尔类型

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

      1. ClassMethod MyFunction()
      2. {
      3. set num = 1
      4. // 输出true
      5. if (num) {
      6. w "true",!
      7. }else{
      8. w "false",!
      9. }
      10. // 输出true
      11. if 0.5 {
      12. w "true",!
      13. }else{
      14. w "false",!
      15. }
      16. // 输出true
      17. if "1 num" {
      18. w "true",!
      19. }else{
      20. w "false",!
      21. }
      22. // 输出0
      23. w "007"=7,!
      24. // 输出0
      25. w "+007"=7,!
      26. // 输出1
      27. w +"007"=7,!
      28. // 输出false
      29. if "num" {
      30. w "true",!
      31. }else{
      32. w "false",!
      33. }
      34. }

      6.日期

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

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

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

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

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

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

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

      1. // 输出14:27:02
      2. w $ztime($p($horolog, ",", 2)),!
      3. // 输出02:27:02PM
      4. w $zt($p($horolog, ",", 2), 3),!
      5. // 输出52022
      6. w $ztimeh("14:27:02"),!
      7. // 输出52022
      8. w $zth("02:27:02PM", 3),!
      • $zdatetime(缩写$zdt):验证日期和时间,将数字转换为日期和时间

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

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

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

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

      1. set t1 = $zh
      2. //等待2秒钟
      3. hang 2
      4. set t2 = $zh
      5. // 输出2.000593
      6. w t2 - t1

    18. 相关阅读:
      html拖动滚动
      Day31脚本编写规则,判断语句,循环语句与case
      Kubernetes(k8s)部署高可用多主多从的Redis集群
      【Java 进阶篇】JDBC ResultSet 类详解
      供应商寄售过程的实现
      GPT-5技术突破预测:革新NLP的未来
      工作经验总结:单片机中简易时间片轮询的结构设计
      大学生环保主题网页制作 环境网页设计模板 学生静态网页作业成品 dreamweaver保护地球环境HTML网站制作
      操作系统期末复习题版详解(含解析)
      学姐想学SpringBoot?连夜整理了一份SpringBoot高阶笔记,涵盖六大核心专题
    19. 原文地址:https://blog.csdn.net/qq_35507234/article/details/126198335