공백으로 채워진 고정 길이 문자열 생성


95

문자 위치 기반 파일을 생성하려면 고정 길이 문자열을 생성해야합니다. 누락 된 문자는 공백 문자로 채워야합니다.

예를 들어, CITY 필드에는 15 자의 고정 길이가 있습니다. 입력 "Chicago"및 "Rio de Janeiro"의 경우 출력은 다음과 같습니다.

"시카고"
" 리오 데 자네이로"
.


답변:


122

Java 1.5부터 java.lang.String.format (String, Object ...) 메소드 사용할 수 있으며 format과 같은 printf를 사용할 수 있습니다.

형식 문자열 "%1$15s"이 작업을 수행합니다. 여기서는 1$인수 인덱스를 s나타내며, 인수가 문자열이며 문자열 15의 최소 ​​너비를 나타냅니다. 종합 : "%1$15s".

일반적인 방법의 경우 다음이 있습니다.

public static String fixedLengthString(String string, int length) {
    return String.format("%1$"+length+ "s", string);
}

누군가가 다른 형식 문자열을 제안하여 빈 공간을 특정 문자로 채울 수 있습니까?


2
Maybe someone can suggest another format string to fill the empty spaces with an specific character?-내가 준 대답을보세요.
마이크

5
따르면 docs.oracle.com/javase/tutorial/essential/io/formatting.html , 1$인수 인덱스 나타내는 15
드미트리 Minkovsky

1
이것은 긴 경우, 생성 된 출력도 이상 15 이하 여야한다 길이 (15)에 문자열을 제한하지 않습니다
misterti

1
@misterti string.substring은 15 자로 제한합니다. 감사합니다
라파엘 보르

1
나는 그것을 언급 했어야했다. 하지만 내 의견의 포인트는 고정 길이 필드에 대한 문제가 될 수 원하는보다 더 오래 출력의 가능성에 대해 경고했다
misterti

55

String.format의 패딩을 공백으로 활용 하고 원하는 문자로 바꿉니다.

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합니다.

그러나 음수 길이의 문자 배열을 만들지 못하도록 검사를 추가해야합니다.


업데이트 된 코드는 잘 작동합니다. 그건 내가 @thanks 마이크 기대했던
sudharsan chandrasekaran

27

이 코드는 정확히 주어진 문자 수를 갖습니다. 공백으로 채워지거나 오른쪽이 잘립니다.

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);
}

12

아래와 같은 간단한 방법을 작성할 수도 있습니다.

public static String padString(String str, int leng) {
        for (int i = str.length(); i <= leng; i++)
            str += " ";
        return str;
    }

8
이것은 확실히 가장 성능이 좋은 대답은 아닙니다. 자바에서 문자열은 불변이기 때문에 기본적으로 메모리에서 str.length + 1과 같은 길이의 N 개의 새 문자열을 생성하므로 매우 낭비 적입니다. 훨씬 더 나은 솔루션은 입력 문자열 길이에 관계없이 하나의 문자열 연결 만 수행하고 StringBuilder 또는 for 루프에서 다른보다 효율적인 문자열 연결 방법을 사용합니다.
anon58192932

12

올바른 패드를 위해서는 String.format("%0$-15s", str)

즉, -기호는 "오른쪽"패드가되고 -기호는 "왼쪽"패드가됩니다.

여기 내 예를 참조하십시오

http://pastebin.com/w6Z5QhnJ

입력은 문자열과 숫자 여야합니다.

예제 입력 : Google 1


10
import org.apache.commons.lang3.StringUtils;

String stringToPad = "10";
int maxPadLength = 10;
String paddingCharacter = " ";

StringUtils.leftPad(stringToPad, maxPadLength, paddingCharacter)

Guava imo보다 훨씬 낫습니다. Guava를 사용하는 단일 엔터프라이즈 Java 프로젝트는 본 적이 없지만 Apache String Utils는 매우 일반적입니다.



6

여기에 깔끔한 트릭이 있습니다.

// 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()'s 
   * 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();
  }
}

3

다음은 테스트 케이스가있는 코드입니다.

@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를 좋아한다;)


2
String.format("%15s",s) // pads right
String.format("%-15s",s) // pads left

여기에 훌륭한 요약


1

이 코드는 훌륭하게 작동합니다. 예상 출력

  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";

행복한 코딩 !!


0
public static String padString(String word, int length) {
    String newWord = word;
    for(int count = word.length(); count < length; count++) {
        newWord = " " + newWord;
    }
    return newWord;
}

0

이 간단한 기능은 저에게 효과적입니다.

public static String leftPad(String string, int length, String pad) {
      return pad.repeat(length - string.length()) + string;
    }

기도:

String s = leftPad(myString, 10, "0");
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.