Создание фиксированной длины Строки, заполненные пробелами
Мне нужно создать строку фиксированной длины для создания файла с позицией символа. Недопустимые символы должны быть заполнены символом пробела.
В качестве примера поле CITY имеет фиксированную длину 15 символов. Для входов "Чикаго" и "Рио-де-Жанейро" выходы
" Chicago"
" Rio de Janeiro"
.
Ответы
Ответ 1
Начиная с Java 1.5 мы можем использовать метод java.lang.String.format(String, Object...) и использовать формат printf.
Строка формата "%1$15s"
выполняет задание. Где 1$
указывает индекс аргумента, s
указывает, что аргумент является строкой, а 15
представляет минимальную ширину строки.
Объединяя все это: "%1$15s"
.
Для общего метода имеем:
public static String fixedLengthString(String string, int length) {
return String.format("%1$"+length+ "s", string);
}
Может кто-то может предложить другую строку форматирования для заполнения пустых пространств определенным символом?
Ответ 2
Используйте String.format
заполнение пробелами и замените их на char.
String toPad = "Apple";
String padded = String.format("%8s", toPad).replace(' ', '0');
System.out.println(padded);
Печать 000Apple
.
Обновить более совершенную версию (поскольку она не полагается на String.format
), которая не имеет проблем с пробелами (спасибо для Rafael Borja для подсказки).
int width = 10;
char fill = '0';
String toPad = "New York";
String padded = new String(new char[width - toPad.length()]).replace('\0', fill) + toPad;
System.out.println(padded);
Печать 00New York
.
Но нужно добавить проверку, чтобы предотвратить попытку создания массива char с отрицательной длиной.
Ответ 3
Этот код будет иметь точно указанное количество символов; заполненный пробелами или усеченный с правой стороны:
private String leftpad(String text, int length) {
return String.format("%" + length + "." + length + "s", text);
}
private String rightpad(String text, int length) {
return String.format("%-" + length + "." + length + "s", text);
}
Ответ 4
Вы также можете написать простой метод, как показано ниже
public static String padString(String str, int leng) {
for (int i = str.length(); i <= leng; i++)
str += " ";
return str;
}
Ответ 5
import org.apache.commons.lang3.StringUtils;
String stringToPad = "10";
int maxPadLength = 10;
String paddingCharacter = " ";
StringUtils.leftPad(stringToPad, maxPadLength, paddingCharacter)
Лучше, чем Гуава имо. Никогда не видел ни одного корпоративного Java-проекта, который использует Guava, но Apache String Utils невероятно распространен.
Ответ 6
Для правой площадки вам понадобится String.format("%0$-15s", str)
то есть знак -
будет "правой" площадкой, а знак -
не "левой" площадкой
посмотрите мой пример здесь
http://pastebin.com/w6Z5QhnJ
входные данные должны быть строкой и числом
Пример ввода: Google 1
Ответ 7
Библиотека Guava имеет Strings.padStart что делает именно то, что вы хотите, наряду со многими другими полезными утилитами.
Ответ 8
Здесь аккуратный трюк:
// E.g pad("sss","00000000"); should deliver "00000sss".
public static String pad(String string, String pad) {
/*
* Add the pad to the left of string then take as many characters from the right
* that is the same length as the pad.
* This would normally mean starting my substring at
* pad.length() + string.length() - pad.length() but obviously the pad.length()
* cancel.
*
* 00000000sss
* ^ ----- Cut before this character - pos = 8 + 3 - 8 = 3
*/
return (pad + string).substring(string.length());
}
public static void main(String[] args) throws InterruptedException {
try {
System.out.println("Pad 'Hello' with ' ' produces: '"+pad("Hello"," ")+"'");
// Prints: Pad 'Hello' with ' ' produces: ' Hello'
} catch (Exception e) {
e.printStackTrace();
}
}
Ответ 9
Вот код с примерами тестов;):
@Test
public void testNullStringShouldReturnStringWithSpaces() throws Exception {
String fixedString = writeAtFixedLength(null, 5);
assertEquals(fixedString, " ");
}
@Test
public void testEmptyStringReturnStringWithSpaces() throws Exception {
String fixedString = writeAtFixedLength("", 5);
assertEquals(fixedString, " ");
}
@Test
public void testShortString_ReturnSameStringPlusSpaces() throws Exception {
String fixedString = writeAtFixedLength("aa", 5);
assertEquals(fixedString, "aa ");
}
@Test
public void testLongStringShouldBeCut() throws Exception {
String fixedString = writeAtFixedLength("aaaaaaaaaa", 5);
assertEquals(fixedString, "aaaaa");
}
private String writeAtFixedLength(String pString, int lenght) {
if (pString != null && !pString.isEmpty()){
return getStringAtFixedLength(pString, lenght);
}else{
return completeWithWhiteSpaces("", lenght);
}
}
private String getStringAtFixedLength(String pString, int lenght) {
if(lenght < pString.length()){
return pString.substring(0, lenght);
}else{
return completeWithWhiteSpaces(pString, lenght - pString.length());
}
}
private String completeWithWhiteSpaces(String pString, int lenght) {
for (int i=0; i<lenght; i++)
pString += " ";
return pString;
}
Мне нравится TDD;)
Ответ 10
Этот код отлично работает. ![Ожидаемый результат]()
String ItemNameSpacing = new String(new char[10 - masterPojos.get(i).getName().length()]).replace('\0', ' ');
printData += masterPojos.get(i).getName()+ "" + ItemNameSpacing + ": " + masterPojos.get(i).getItemQty() +" "+ masterPojos.get(i).getItemMeasure() + "\n";
Счастливое кодирование!!
Ответ 11
public static String padString(String word, int length) {
String newWord = word;
for(int count = word.length(); count < length; count++) {
newWord = " " + newWord;
}
return newWord;
}