空白で埋められた固定長の文字列を生成する


95

文字位置ベースのファイルを生成するには、固定長の文字列を生成する必要があります。欠落している文字はスペース文字で埋める必要があります。

例として、フィールドCITYの固定長は15文字です。入力「シカゴ」と「リオデジャネイロ」の場合、出力は

「シカゴ」
" リオデジャネイロ"


これが正解です。stackoverflow.com
a /

回答:


122

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
Maybe someone can suggest another format string to fill the empty spaces with an specific character?-私が与えた答えを見てください。
マイク2015年

5
docs.oracle.com/javase/tutorial/essential/io/formatting.htmlによると1$、引数のインデックスと15幅を表します
Dmitry 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

ただし、負の長さのchar配列を作成しないようにするには、チェックを追加する必要があります。


更新されたコードはうまく機能します。私が期待していたこと@マイクのおかげで
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
これは間違いなく最もパフォーマンスの高い答えではありません。文字列はJavaでは不変であるため、メモリ内にstr.length + 1と等しい長さのN個の新しい文字列を生成しているため、非常に無駄が多くなります。より優れたソリューションは、入力文字列の長さに関係なく1つの文字列連結のみを実行し、forループでStringBuilderまたは文字列連結の他のより効率的な方法を利用します。
anon58192932 2017年

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を使用する単一のエンタープライズ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.