Обрезать строку на основе длины строки

Я хочу обрезать строку, если длина превышает 10 символов.

Предположим, если длина строки равна 12 (String s="abcdafghijkl"), то новая обрезанная строка будет содержать "abcdefgh..".

Как я могу это достичь?

Ответ 1

s = s.substring(0, Math.min(s.length(), 10));

Использование Math.min подобно этому исключает исключение в случае, когда строка уже короче 10.


Примечания:

  • Вышеуказанная реальная обрезка. Если вы действительно хотите заменить последние три символа (!) Точками, если они усекаются, используйте Apache Commons StringUtils.abbreviate.

  • Это может вести себя некорректно 1 если ваша строка содержит кодировки Unicode вне BMP; например Emojis. Для решения, которое корректно работает для всех кодовых кодов Unicode, см. Решение @sibnick .


1 - Кодовый код Unicode, который не находится на плоскости 0 (BMP), представлен как "суррогатная пара" (т.е. два значения char) в String. Не обращая внимания на это, мы можем сократить до менее 10 кодовых пунктов или (хуже) усечь в середине суррогатной пары. С другой стороны, String.length() больше не является идеальной мерой длины текста в Unicode, поэтому обрезка на основе этого может быть неправильной.

Ответ 2

StringUtils.abbreviate из Библиотека Apache Commons Lang может быть вашим другом:

StringUtils.abbreviate("abcdefg", 6) = "abc..."
StringUtils.abbreviate("abcdefg", 7) = "abcdefg"
StringUtils.abbreviate("abcdefg", 8) = "abcdefg"
StringUtils.abbreviate("abcdefg", 4) = "a..."

Ответ 3

Существует функция StringUtils, которая делает это.

s = StringUtils.left(s, 10)

Если len-символы недоступны или String имеет значение NULL, строка будет возвращена без исключения. Пустая строка возвращается, если len отрицательна.

StringUtils.left(null,) = null
StringUtils.left(, -ve) = "
StringUtils.left(" ", *) = "
StringUtils.left(" abc", 0) = "
StringUtils.left(" abc ", 2) =" ab "
StringUtils.left(" abc ", 4) =" abc"

StringUtils.Left JavaDocs

Предоставлено: Steeve McCauley

Ответ 4

s = s.length() > 10 ? s.substring(0, 9) : s;

Ответ 5

Как обычно, никто не заботится о суррогатных парах UTF-16. Посмотрите о них: Каковы наиболее распространенные символы без символов BMP Unicode в действии? Даже авторы org.apache.commons/commons-lang3

В этом примере вы можете увидеть разницу между правильным кодом и обычным кодом:

public static void main(String[] args) {
    //string with FACE WITH TEARS OF JOY symbol
    String s = "abcdafghi\uD83D\uDE02cdefg";
    int maxWidth = 10;
    System.out.println(s);
    //do not care about UTF-16 surrogate pairs
    System.out.println(s.substring(0, Math.min(s.length(), maxWidth)));
    //correctly process UTF-16 surrogate pairs
    if(s.length()>maxWidth){
        int correctedMaxWidth = (Character.isLowSurrogate(s.charAt(maxWidth)))&&maxWidth>0 ? maxWidth-1 : maxWidth;
        System.out.println(s.substring(0, Math.min(s.length(), correctedMaxWidth)));
    }
}

Ответ 6

Или вы можете просто использовать этот метод, если у вас нет StringUtils:

public static String abbreviateString(String input, int maxLength) {
    if (input.length() <= maxLength) 
        return input;
    else 
        return input.substring(0, maxLength-2) + "..";
}

Ответ 7

На всякий случай вы ищете способ обрезать и сохранить LAST 10 символов строки.

s = s.substring(Math.max(s.length(), 10) - 10);