文章目录

第二十五章 Caché 函数大全 $LENGTH 函数

返回字符串中的字符数或带分隔符的子字符串。

大纲
$LENGTH(expression,delimiter)
$L(expression,delimiter)

参数

  • expression 目标字符串。它可以是数值,字符串文字,变量名称或任何可解析为字符串的有效表达式。
  • delimiter 可选-在目标字符串中划分单独的子字符串的字符串。它可以是变量名,数值,字符串文字或任何可解析为字符串的有效表达式。
描述

$LENGTH根据使用的参数返回指定字符串中的字符数或指定字符串中带分隔符的子字符串数。请注意,长度计算字符数;8位字符和16位宽(Unicode)字符都被视为一个字符。

  • $LENGTH(expression)返回字符串中的字符数。如果表达式为空字符串,则$LENGTH返回0。如果表达式为数字表达式,则在确定其长度之前将其转换为规范形式。如果expression是字符串数字表达式,则不执行任何转换。如果expression是$DOUBLEINF-INFNAN,则返回的长度分别为3、4和3。

此语法可以与$EXTRACT函数一起使用,该函数按位置查找子字符串并返回该子字符串的值。

  • $LENGTH(expression,delimiter)返回字符串中子字符串的数量。 $LENGTH返回由指定的定界符彼此分隔的子字符串数。此数字始终等于字符串中定界符的数量加一。

此语法可以与$PIECE函数一起使用,该函数通过定界符查找子字符串并返回该子字符串值。

如果定界符是空字符串,则$LENGTH返回0。如果定界符是任何其他有效字符串文字,并且该字符串是空字符串,则$LENGTH返回1。

编码字符串

Caché支持包含内部编码的字符串。由于这种编码,$LENGTH不应用于确定字符串的数据内容。

  • $LENGTH不应用于使用$LISTBUILD$LIST创建的List结构字符串。因为Caché List字符串已编码,所以返回的长度不会有意义地指示列表元素中的字符数。唯一的例外是$LIST的一参数形式和二参数形式,它们采用编码的Caché List字符串作为输入,但输出单个List元素值作为标准字符串。可以使用$LISTLENGTH函数确定已编码列表字符串中子字符串(列表元素)的数量。
  • $LENGTH不应用于位字符串。由于对Caché位字符串进行了编码,因此返回的长度不会有意义地指示位字符串中的位数。可以使用$BITCOUNT函数,该函数返回字符串中的位数。
  • $LENGTH不应用于JSON字符串。通过将变量设置为JSON对象或JSON数组分配的值是对象引用。因此,该变量值的长度将是对象引用的长度,该长度与JSON字符串中编码的数据的长度无关。

代理对

$LENGTH无法识别代理对。代理对用于表示某些中文字符并支持日语JIS2004标准。可以使用$WISWIDE函数确定字符串是否包含代理对。 $WLENGTH函数可以识别并正确解析代理对。 $LENGTH$WLENGTH在其他方面相同。但是,由于$LENGTH通常比$WLENGTH快,因此对于不太可能遇到代理对的所有情况,$LENGTH是更可取的。

示例

在下面的示例中,两个$LENGTH函数都返回4,即字符串中的字符数。

/// d ##class(PHA.TEST.Function).LENGTH()
ClassMethod LENGTH()
{
	IF $SYSTEM.Version.IsUnicode() {
		SET roman="test"
		WRITE !,$LENGTH(roman)," characters in: ",roman
		SET greek=$CHAR(964,949,963,964)
		WRITE !,$LENGTH(greek)," characters in: ",greek
	}
	ELSE {WRITE "此示例需要Caché的Unicode安装"}
}
DHC-APP>d ##class(PHA.TEST.Function).LENGTH()
 
4 characters in: test
4 characters in: τεστ

在下面的示例中,第一个$LENGTH返回5。这是74000的长度,即指定数字的规范版本。第二个$LENGTH返回8,即字符串“+007.4e4”的长度。

/// d ##class(PHA.TEST.Function).LENGTH1()
ClassMethod LENGTH1()
{
   WRITE !,$LENGTH(+007.4e4)
   WRITE !,$LENGTH("+007.4e4")
}

DHC-APP> d ##class(PHA.TEST.Function).LENGTH1()
 
5
8

在下面的示例中,第一个WRITE返回11var1中的字符数(当然包括空格字符)。第二个WRITE返回2,即使用空格字符作为子字符串定界符的var1中的子字符串数。

/// d ##class(PHA.TEST.Function).LENGTH2()
ClassMethod LENGTH2()
{
	SET var1="HELLO WORLD"
	WRITE !,$LENGTH(var1)
	WRITE !,$LENGTH(var1," ")
}
DHC-APP>d ##class(PHA.TEST.Function).LENGTH2()
 
11
2

下面的示例返回3,即字符串中子字符串的数量,以美元符号($)字符分隔。

DHC-APP>SET STR="ABC$DEF$EFG",DELIM="$"
 
DHC-APP>WRITE $LENGTH(STR,DELIM)
3

如果在字符串中找不到指定的分隔符,则$LENGTH返回1,因为唯一的子字符串是字符串本身。

下面的示例返回0,因为测试的字符串是空字符串。

DHC-APP>SET Nstring = ""
 
DHC-APP>WRITE $LENGTH(Nstring)
0

以下示例显示了分隔符或其字符串为空字符串时返回的值。

/// d ##class(PHA.TEST.Function).LENGTH3()
ClassMethod LENGTH3()
{
	SET String = "ABC"
	SET Nstring = ""
	SET Delim = "$"
	SET Ndelim = ""
	WRITE !,$LENGTH(String,Delim)   ; returns 1
	WRITE !,$LENGTH(Nstring,Delim)  ; returns 1
	WRITE !,$LENGTH(String,Ndelim)  ; returns 0
	WRITE !,$LENGTH(Nstring,Ndelim) ; returns 0
}
DHC-APP>d ##class(PHA.TEST.Function).LENGTH3()
 
1
1
0
0