Java用省略号截断字符串的理想方法

我敢肯定,我们所有人都在Facebook状态(或其他位置)上看到省略号,然后单击“显示更多”,并且只有另外两个字符左右。我猜这是由于懒惰的编程,因为肯定有一种理想的方法。

我的人把苗条的字符算作[iIl1]“半个字符”,但是当省略号几乎没有隐藏任何字符时,这并不能解决。

有没有理想的方法?这是我的:

/**

* Return a string with a maximum length of <code>length</code> characters.

* If there are more than <code>length</code> characters, then string ends with an ellipsis ("...").

*

* @param text

* @param length

* @return

*/

public static String ellipsis(final String text, int length)

{

// The letters [iIl1] are slim enough to only count as half a character.

length += Math.ceil(text.replaceAll("[^iIl]", "").length() / 2.0d);

if (text.length() > length)

{

return text.substring(0, length - 3) + "...";

}

return text;

}

语言并不重要,但可以标记为Java,因为这是我最感兴趣的内容。

回答:

我喜欢让“瘦”字符算作半个字符的想法。简单而良好的近似。

然而,大多数省略的主要问题是(imho)他们在中间砍了字。这是一个考虑单词边界的解决方案(但不涉及像素数学和Swing-API)。

private final static String NON_THIN = "[^iIl1\\.,']";

private static int textWidth(String str) {

return (int) (str.length() - str.replaceAll(NON_THIN, "").length() / 2);

}

public static String ellipsize(String text, int max) {

if (textWidth(text) <= max)

return text;

// Start by chopping off at the word before max

// This is an over-approximation due to thin-characters...

int end = text.lastIndexOf(' ', max - 3);

// Just one long word. Chop it off.

if (end == -1)

return text.substring(0, max-3) + "...";

// Step forward as long as textWidth allows.

int newEnd = end;

do {

end = newEnd;

newEnd = text.indexOf(' ', end + 1);

// No more spaces.

if (newEnd == -1)

newEnd = text.length();

} while (textWidth(text.substring(0, newEnd) + "...") < max);

return text.substring(0, end) + "...";

}

以上是 Java用省略号截断字符串的理想方法 的全部内容, 来源链接: utcz.com/qa/422398.html

回到顶部