Método ideal para truncar una cadena con puntos suspensivos

Estoy seguro de que todos hemos visto puntos suspensivos en los estados de Facebook (o en otros lugares), y hemos hecho clic en "Mostrar más" y solo hay otros 2 caracteres más o menos. Supongo que esto se debe a la programación diferida, porque seguramente hay un método ideal.

El mío cuenta con personajes delgados[iIl1] como "medios caracteres", pero esto no evita que los puntos suspensivos parezcan tontos cuando esconden apenas a cualquier personaje.

¿Hay un método ideal? Aquí esta el mio:

/**
 * 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;
}

El lenguaje realmente no importa, pero está etiquetado como Java porque eso es lo que más me interesa ver.

Respuestas a la pregunta(12)

Su respuesta a la pregunta