Я хочу обрезать строку, если длина превышает 10 символов.
Предположим, если длина строки равна 12 (String s="abcdafghijkl"
), то новая обрезанная строка будет содержать "abcdefgh.."
.
Как я могу это достичь?
Я хочу обрезать строку, если длина превышает 10 символов.
Предположим, если длина строки равна 12 (String s="abcdafghijkl"
), то новая обрезанная строка будет содержать "abcdefgh.."
.
Как я могу это достичь?
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, поэтому обрезка на основе этого может быть неправильной.
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..."
Существует функция 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"
Предоставлено: Steeve McCauley
s = s.length() > 10 ? s.substring(0, 9) : s;
Как обычно, никто не заботится о суррогатных парах 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)));
}
}
Или вы можете просто использовать этот метод, если у вас нет StringUtils:
public static String abbreviateString(String input, int maxLength) {
if (input.length() <= maxLength)
return input;
else
return input.substring(0, maxLength-2) + "..";
}
На всякий случай вы ищете способ обрезать и сохранить LAST 10 символов строки.
s = s.substring(Math.max(s.length(), 10) - 10);