#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.
Комментарии:
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"
Ответ №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», «Длинная строка»);