第二十五章 Caché 函數大全 $LENGTH 函數
返回字符串中的字符數或帶分隔符的子字符串。
大綱
$LENGTH(expression,delimiter)
$L(expression,delimiter)
參數
- expression 目標字符串。它可以是數值,字符串文字,變量名稱或任何可解析爲字符串的有效表達式。
- delimiter 可選-在目標字符串中劃分單獨的子字符串的字符串。它可以是變量名,數值,字符串文字或任何可解析爲字符串的有效表達式。
描述
$LENGTH
根據使用的參數返回指定字符串中的字符數或指定字符串中帶分隔符的子字符串數。請注意,長度計算字符數;8位字符和16位寬(Unicode)字符都被視爲一個字符。
-
$LENGTH(expression)
返回字符串中的字符數。如果表達式爲空字符串,則$LENGTH
返回0。如果表達式爲數字表達式,則在確定其長度之前將其轉換爲規範形式。如果expression是字符串數字表達式,則不執行任何轉換。如果expression是$DOUBLE
值INF
,-INF
或NAN
,則返回的長度分別爲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