Я хочу обрезать строку, если длина превышает 10 символов.
Предположим, что если длина строки равна 12 ( String s="abcdafghijkl"
), тогда новая обрезанная строка будет содержать "abcdefgh.."
.
Как мне этого добиться?
Я хочу обрезать строку, если длина превышает 10 символов.
Предположим, что если длина строки равна 12 ( String s="abcdafghijkl"
), тогда новая обрезанная строка будет содержать "abcdefgh.."
.
Как мне этого добиться?
Ответы:
s = s.substring(0, Math.min(s.length(), 10));
С помощью Math.min
like this позволяет избежать исключения в случае, когда строка уже короче, чем 10
.
Ноты:
Вышеупомянутое делает настоящую обрезку. Если вы действительно хотите заменить последние три (!) Символа точками, если он усекается, используйте Apache CommonsStringUtils.abbreviate
.
Это может вести себя неправильно 1, если ваша строка содержит кодовые точки Unicode вне BMP; например, Emojis. Для (более сложного) решения , которое работает правильно для всех Unicode кодовых точек, см @ sibnick - й решение .
1 - Кодовая точка Unicode, которая не находится в плоскости 0 (BMP), представлена как «суррогатная пара» (т. Е. Два char
значения) в String
. Игнорируя это, мы можем обрезать менее 10 кодовых точек или (что еще хуже) обрезать в середине суррогатной пары. С другой стороны, String.length()
это уже не идеальная мера длины текста Unicode, поэтому обрезка на ее основе может быть неправильным решением.
s = (s.length() > 10) ? s.substring(0,10) : s ;
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..."
Commons Lang3 даже позволяет установить пользовательскую строку в качестве маркера замены. С его помощью вы можете, например, установить односимвольный многоточие.
StringUtils.abbreviate("abcdefg", "\u2026", 6) = "abcde…"
Для этого есть StringUtils
функция Apache Commons .
s = StringUtils.left(s, 10)
Если символы len недоступны или String имеет значение null, String будет возвращен без исключения. Если len отрицательное, возвращается пустая строка.
StringUtils.left (null, ) = null
StringUtils.left ( , -ve) = ""
StringUtils.left ("", *) = ""
StringUtils.left ("abc", 0) = ""
StringUtils.left (" abc ", 2) =" ab "
StringUtils.left (" abc ", 4) =" abc "
Предоставлено: Стив Макколи.
Как обычно, никому нет дела до суррогатных пар UTF-16. См. О них: Какие символы Unicode, отличные от BMP, наиболее часто используются на практике? Даже авторы 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)));
}
}
s = s.length() > 10 ? s.substring(0, 9) : s;
Или вы можете просто использовать этот метод, если у вас нет StringUtils под рукой:
public static String abbreviateString(String input, int maxLength) {
if (input.length() <= maxLength)
return input;
else
return input.substring(0, maxLength-2) + "..";
}
System.out.println(abbreviateString("ABC\ud83d\udc3bDEF", 6));
С Kotlin это так же просто, как:
yourString.take(10)
Возвращает строку, содержащую первые n символов этой строки, или всю строку, если эта строка короче.
Кажется, вы запрашиваете символ многоточия ( …
) в последнем месте при усечении. Вот однострочник для управления вашей входной строкой.
String input = "abcdefghijkl";
String output = ( input.length () > 10 ) ? input.substring ( 0 , 10 - 1 ).concat ( "…" ) : input;
Посмотри это код запускается вживую на IdeOne.com.
ABCDEFGHI ...
Мы можем сделать однострочник, используя тернарный оператор .
String input = "abcdefghijkl" ;
String output =
( input.length() > 10 ) // If too long…
?
input
.substring( 0 , 10 - 1 ) // Take just the first part, adjusting by 1 to replace that last character with an ellipsis.
.concat( "…" ) // Add the ellipsis character.
: // Or, if not too long…
input // Just return original string.
;
Посмотрите, как этот код запускается вживую на IdeOne.com.
ABCDEFGHI ...
Средство Java Streams делает это интересным, начиная с Java 9 и новее. Интересный, но, может быть, не лучший подход.
Мы используем кодовые точки, а не char
значения. char
Тип наследство, и ограничивается подмножество всех возможных Unicode символов.
String input = "abcdefghijkl" ;
int limit = 10 ;
String output =
input
.codePoints()
.limit( limit )
.collect( // Collect the results of processing each code point.
StringBuilder::new, // Supplier<R> supplier
StringBuilder::appendCodePoint, // ObjIntConsumer<R> accumulator
StringBuilder::append // BiConsumer<R,R> combiner
)
.toString()
;
Если у нас были усечены лишние символы, замените последний символ многоточием .
if ( input.length () > limit )
{
output = output.substring ( 0 , output.length () - 1 ) + "…";
}
Если бы я только мог придумать способ соединить линию потока с частью «если превышено ограничение, сделай многоточие».