С помощью Math.min like this позволяет избежать исключения в случае, когда строка уже короче, чем 10.
Ноты:
Вышеупомянутое делает настоящую обрезку. Если вы действительно хотите заменить последние три (!) Символа точками, если он усекается, используйте Apache CommonsStringUtils.abbreviate .
Это может вести себя неправильно 1, если ваша строка содержит кодовые точки Unicode вне BMP; например, Emojis. Для (более сложного) решения , которое работает правильно для всех Unicode кодовых точек, см @ sibnick - й решение .
1 - Кодовая точка Unicode, которая не находится в плоскости 0 (BMP), представлена как «суррогатная пара» (т. Е. Два charзначения) в String. Игнорируя это, мы можем обрезать менее 10 кодовых точек или (что еще хуже) обрезать в середине суррогатной пары. С другой стороны, String.length()это уже не идеальная мера длины текста Unicode, поэтому обрезка на ее основе может быть неправильным решением.
Вместо Math.min не можем ли мы выполнить условную проверку и сделать подстроку только в том случае, если строка является максимальной, а это необходимо? например:s = (s.length() > 10) ? s.substring(0,10) : s ;
rram
1
Да, конечно ты можешь. Прочтите другие ответы, чтобы узнать о других способах решения проблемы!
Commons Lang3 даже позволяет установить пользовательскую строку в качестве маркера замены. С его помощью вы можете, например, установить односимвольный многоточие.
@StephenC - вопрос показывает 8 символов, за которыми следуют 2 точки, с учетом ограничения длины 10, что очень похоже на многоточие (всего 2 точки, а не 3). Также вероятно, что многие люди, задавшие этот вопрос, сочтут многоточие полезным.
ToolmakerSteve
12
... и если вам не нужно многоточие, вам может помочь StringUtils.left ().
В этом примере вы можете увидеть разницу между правильным кодом и обычным кодом:
publicstaticvoid main(String[] args){//string with FACE WITH TEARS OF JOY symbolString s ="abcdafghi\uD83D\uDE02cdefg";int maxWidth =10;System.out.println(s);//do not care about UTF-16 surrogate pairsSystem.out.println(s.substring(0,Math.min(s.length(), maxWidth)));//correctly process UTF-16 surrogate pairsif(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)));}}
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.;
Нет. Ясно, что он хочет сократить длину струны, если она достигает длины 11 или более. Вы, должно быть, работаете над новой системой искусственного интеллекта oO
JD333 02
1
@ JD333 Ваш комментарий ускользнул от меня. Усечение до длины 10, включая многоточие, - это именно то, что я показываю здесь.
Ответы:
С помощью
Math.min
like this позволяет избежать исключения в случае, когда строка уже короче, чем10
.Ноты:
Вышеупомянутое делает настоящую обрезку. Если вы действительно хотите заменить последние три (!) Символа точками, если он усекается, используйте Apache Commons
StringUtils.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 может быть вашим другом:Commons Lang3 даже позволяет установить пользовательскую строку в качестве маркера замены. С его помощью вы можете, например, установить односимвольный многоточие.
источник
Для этого есть
StringUtils
функция Apache Commons .StringUtils.Left JavaDocs
Предоставлено: Стив Макколи.
источник
Как обычно, никому нет дела до суррогатных пар UTF-16. См. О них: Какие символы Unicode, отличные от BMP, наиболее часто используются на практике? Даже авторы org.apache.commons / commons-lang3
В этом примере вы можете увидеть разницу между правильным кодом и обычным кодом:
источник
s = s.length() > 10 ? s.substring(0, 9) : s;
источник
Или вы можете просто использовать этот метод, если у вас нет StringUtils под рукой:
источник
System.out.println(abbreviateString("ABC\ud83d\udc3bDEF", 6));
На всякий случай вы ищете способ обрезать и сохранить ПОСЛЕДНИЕ 10 символов строки.
источник
С Kotlin это так же просто, как:
Документация
источник
ТЛ; др
Кажется, вы запрашиваете символ многоточия (
…
) в последнем месте при усечении. Вот однострочник для управления вашей входной строкой.Посмотри это код запускается вживую на IdeOne.com.
Тернарный оператор
Мы можем сделать однострочник, используя тернарный оператор .
Посмотрите, как этот код запускается вживую на IdeOne.com.
Потоки Java
Средство Java Streams делает это интересным, начиная с Java 9 и новее. Интересный, но, может быть, не лучший подход.
Мы используем кодовые точки, а не
char
значения.char
Тип наследство, и ограничивается подмножество всех возможных Unicode символов.Если у нас были усечены лишние символы, замените последний символ многоточием .
Если бы я только мог придумать способ соединить линию потока с частью «если превышено ограничение, сделай многоточие».
источник
или,
Работает с null.
источник