Обрезать строку на основе длины строки - PullRequest
107 голосов
/ 14 декабря 2011

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

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

Как мне этого добиться?

Ответы [ 9 ]

212 голосов
/ 14 декабря 2011
s = s.substring(0, Math.min(s.length(), 10));

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


Примечания:

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

  2. Это может вести себя некорректно 1 , если ваша строка содержит кодовые точки Unicode вне BMP; например Emojis. Для (более сложного) решения, которое работает корректно для всех кодовых точек Unicode, см. @ 1018 * решение * sibnick .


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

106 голосов
/ 14 ноября 2013

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..."
40 голосов
/ 07 февраля 2016

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

s = StringUtils.left(s, 10)

Если символы len недоступны или строка является нулевой, строка будет возвращена без исключения.Пустая строка возвращается, если 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

16 голосов
/ 26 августа 2015

Как обычно никто не заботится о суррогатных парах 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)));
    }
}
10 голосов
/ 14 декабря 2011

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

6 голосов
/ 26 августа 2015

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

public static String abbreviateString(String input, int maxLength) {
    if (input.length() <= maxLength) 
        return input;
    else 
        return input.substring(0, maxLength-2) + "..";
}
4 голосов
/ 26 мая 2017

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

s = s.substring(Math.max(s.length(),10) - 10);
3 голосов
/ 28 февраля 2019

С Kotlin это так же просто, как:

yourString.take(10)

Возвращает строку, содержащую первые n символов из этой строки, или всю строку, если эта строка короче.

Документация

0 голосов
/ 12 июня 2018
str==null ? str : str.substring(0, Math.min(str.length(), 10))

или,

str==null ? "" : str.substring(0, Math.min(str.length(), 10))

Работает с нулем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...