Ограничение количества символов в строке и отсечение всего остального

#java #string #string-formatting

#java #строка #подстрока

Вопрос:

Мне нужно создать сводную таблицу в конце журнала с некоторыми значениями, которые получены внутри класса. Таблица должна быть напечатана в формате фиксированной ширины. У меня уже есть код для этого, но мне нужно ограничить строки, удвоения и целые числа размером фиксированной ширины, который жестко задан в коде.

Итак, предположим, я хочу напечатать таблицу фиксированной ширины с

     int,string,double,string
    int,string,double,string
    int,string,double,string
    int,string,double,string

    and the fixed widths are: 4, 5, 6, 6.
  

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

     124891, difference, 22.348, montreal
  

строки, которые необходимо напечатать, должны быть:

     1248 diffe 22.348 montre
  

Я думаю, мне нужно сделать что-то в конструкторе, что заставляет
строка не должна превышать определенное количество символов. Я, вероятно,
преобразуйте двойные и целые числа в строку, чтобы я мог обеспечить максимальную ширину
требования.

Я не знаю, какой метод это делает, и можно ли создать экземпляр строки, чтобы она вела себя подобным образом. Использование средства форматирования помогает только с фиксированным форматированием для печати строки, но фактически не удаляет символы, длина которых превышает максимальную.

Комментарии:

1. если ( ff.length()>7 ) ff = ff.substring(0,7);

Ответ №1:

Вы также можете использовать String.format("%3.3s", "abcdefgh") . Первая цифра — это минимальная длина (строка будет дополнена, если она короче), вторая цифра — это максимальная длина, и строка будет усечена, если она длиннее. Итак

 System.out.printf("'%3.3s' '%3.3s'", "abcdefgh", "a");
  

приведет к

 'abc' '  a'
  

(вы можете удалить кавычки, очевидно).

Комментарии:

1. используйте String.format(String format, Object... args) как более распространенный подход

2. Какой строковый синтаксис используется для получения последних n символов строки?

3. Вероятно, медленнее, чем String::substring(0, max) однако.

Ответ №2:

Используйте это, чтобы отсечь ненужные символы:

 String.substring(0, maxLength); 
  

Пример:

 String aString ="123456789";
String cutString = aString.substring(0, 4);
// Output is: "1234" 
  

Чтобы убедиться, что вы не получаете исключение IndexOutOfBoundsException, когда входная строка меньше ожидаемой длины, вместо этого выполните следующее:

 int maxLength = (inputString.length() < MAX_CHAR)?inputString.length():MAX_CHAR;
inputString = inputString.substring(0, maxLength);
  

Если вы хотите, чтобы ваши целые числа и удвоения имели определенную длину, тогда я предлагаю вам использовать NumberFormat для форматирования ваших чисел вместо того, чтобы обрезать их строковое представление.

Комментарии:

1. Хм. Было бы здорово, если бы «Точность» работала и для String.

2. Я думаю, inputString.substring(0, Math.min(MAX_CHAR, inputString.length())); это намного более читабельно.

3. или inputString.substring(0, (inputString.length() > MAX_CHAR) ? MAX_CHAR : inputString.length())

4. это в сочетании с функцией String.transform (), представленной в JDK 12, является лучшим 🙂

5. Этот ответ может выдать недопустимую строку, если она содержит суррогатные пары.

Ответ №3:

Для удобства чтения я предпочитаю это:

 if (inputString.length() > maxLength) {
    inputString = inputString.substring(0, maxLength);
}
  

из-за принятого ответа.

 int maxLength = (inputString.length() < MAX_CHAR)?inputString.length():MAX_CHAR;
inputString = inputString.substring(0, maxLength);
  

Ответ №4:

Вы можете использовать статический метод Apache Commons StringUtils.substring(String str, int start, int end) , который также безопасен для null.

Смотрите: http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringUtils.html#substring(java.lang.Строка, int, int)

и http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/src-html/org/apache/commons/lang/StringUtils.html#line.1961

Комментарии:

1. Еще проще: используйте метод left .

2. Добавление библиотеки для усечения строки является чрезмерным. Предостережение для этого решения заключается в том, чтобы использовать это только в том случае, если вы уже используете commons

Ответ №5:

Вы можете легко достичь этого с помощью

     shortString = longString.substring(0, Math.min(s.length(), MAX_LENGTH));
  

Ответ №6:

Если вам просто нужна максимальная длина, используйте StringUtils.left ! Нет if или ternary ?: не требуется.

 int maxLength = 5;
StringUtils.left(string, maxLength);
  

Вывод:

       null -> null
        "" -> ""
       "a" -> "a"
"abcd1234" -> "abcd1"
  

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

Ответ №7:

Решение может быть java.lang.String.format("%" maxlength "s", string).trim() таким:

 int maxlength = 20;
String longString = "Any string you want which length is greather than 'maxlength'";
String shortString = "Anything short";
String resultForLong = java.lang.String.format("%"   maxlength   "s", longString).trim();
String resultForShort = java.lang.String.format("%"   maxlength   "s", shortString).trim();
System.out.println(resultForLong);
System.out.println(resultForShort);
  

вывод:

Any string you want w

Anything short

Комментарии:

1. Использование «%.20s» вместо » s» устраняет необходимость в обрезке

Ответ №8:

В идеале вы должны стараться не изменять внутреннее представление данных с целью создания таблицы. В чем проблема с String.format()? Это вернет вам новую строку с требуемой шириной.

Комментарии:

1. Ну, может быть, я использую это неправильно. но на самом деле это не меняет длину моей строки. Я использовал форматировщик без эффекта. Он отлично печатает содержимое, но не изменяет длину строки: Formatter fmt = new Formatter(); // Соответствующие форматы для объявленных элементов String hardCodedFormat = «%5s%5s»; // s String m_Project; String name = «mynameis»; String name2 = «ted123»; fmt.format(hardCodedFormat, name, name2); System.out.println( fmt);

2. @Flethuseo Вы должны быть в состоянии усекать строки. Попробуйте это: System.err.format(«%1$.5s», «Длинная строка»);