例如汉字 "你我他" 的长度为6,"Hello"的长度为5。而这个函数的作用是限制字符串长度而不是字符数量。
函数写得略复杂,有兴趣的可以理解然后优化下。
1.[代码]测试代码
public void testLimitStringLength() throws Exception {
assertEquals("Hello World!", NormalUtils.limitStringLength("Hello World!", 20, "…", 2));
assertEquals("Hello World!", NormalUtils.limitStringLength("Hello World!", 12, "…", 2));
assertEquals("Hello…", NormalUtils.limitStringLength("Hello World!", 7, "…", 2));
assertEquals("哎,巴扎嘿!", NormalUtils.limitStringLength("哎,巴扎嘿!", 20, "…", 2));
assertEquals("哎,巴扎嘿!", NormalUtils.limitStringLength("哎,巴扎嘿!", 12, "…", 2));
assertEquals("哎,…", NormalUtils.limitStringLength("哎,巴扎嘿!", 7, "…", 2));
assertEquals("哎,巴…", NormalUtils.limitStringLength("哎,巴扎嘿!", 7, "…", 2));
}
2.[代码]主函数
/**
* 限制字符串长度(以字符长度为单位,不是字符个数。假设半角的长度为1,全角为2)
* @param src源字符串
* @param maxByteCharLength最大字符串长度
* @param endingString结束字符串
* @param endingStringByteLength结束字符串长度
* @return
* @throws IOException
*/
public static String limitStringLength(final String src, final int maxByteCharLength,
final String endingString, final int endingStringByteLength) {
if (isStringEmptyOrNull(src)) return src;
StringReader sr = new StringReader(src);
int read = 0;
List arrayList = new ArrayList();
int byteCharCount = 0, shortCharCount = 0;
try {
//循环完成后有三种情况,分隔符代表最长限制:a|啊|口|阿
while ((read = sr.read()) != -1) {
if (read < 256) {
byteCharCount++;
} else {
shortCharCount++;
}
arrayList.add((char) read);
if (byteCharCount + (shortCharCount << 1) >= maxByteCharLength) {
read = sr.read();
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
int charLen = byteCharCount + (shortCharCount << 1);
if (read != -1) {
//后面还有字符,丢弃字符直到少于等于maxByteCharLength - endingStringByteLength位,补充endingString
if (charLen > maxByteCharLength) {
arrayList.remove(arrayList.size() - 1);
arrayList.remove(arrayList.size() - 1);
} else if (charLen == maxByteCharLength) {
if (arrayList.remove(arrayList.size() - 1) < 256) {
arrayList.remove(arrayList.size() - 1);
}
}
return displayArray(arrayList.toArray(), "") + endingString;
} else {
if (charLen > maxByteCharLength) {
arrayList.remove(arrayList.size() - 1);
arrayList.remove(arrayList.size() - 1);
return displayArray(arrayList.toArray(), "") + endingString;
} else {
return displayArray(arrayList.toArray(), "");
}
}
}
3.[代码]displayArray
/**
* 将数组转换成字符串,简单起见应该用Arrays.toString(Object[] arr)
* @param arrObjects对象数组
* @param joinString隔开每个内容的字符串
* @return转换结果
*/
public static String displayArray(final Object[] arrObjects, final String joinString) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < arrObjects.length; i++) {
sb.append(arrObjects[i]);
if (i + 1 < arrObjects.length) sb.append(joinString);
}
return sb.toString();
}