且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-10-16 12:06:53

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

I like the idea of letting "thin" characters count as half a character. Simple and a good approximation.

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

The main issue with most ellipsizings however, are (imho) that they chop of words in the middle. Here is a solution taking word-boundaries into account (but does not dive into pixel-math and the 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) + "...";
}

算法测试如下: