116

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

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

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

4

15 に答える 15

143

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

誰かが空のスペースを特定の文字で埋めるために別のフォーマット文字列を提案できるかもしれませんか?

于 2012-11-20T14:32:02.913 に答える
63

スペースのあるパディングを利用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配列を作成しようとしないように、チェックを追加する必要があります。

于 2014-11-07T00:18:46.727 に答える
34

このコードには、正確に指定された文字数が含まれます。スペースで埋められているか、右側が切り捨てられています。

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);
}
于 2016-06-29T21:21:22.917 に答える
17

右のパッドには必要ですString.format("%0$-15s", str)

つまり-、記号は「右」パッドになり、-記号は「左」パッドになりません

私の例を参照してください:

import java.util.Scanner;
 
public class Solution {
 
    public static void main(String[] args) {
            Scanner sc=new Scanner(System.in);
            System.out.println("================================");
            for(int i=0;i<3;i++)
            {
                String s1=sc.nextLine();
                
                
                Scanner line = new Scanner( s1);
                line=line.useDelimiter(" ");
               
                String language = line.next();
                int mark = line.nextInt();;
                
                System.out.printf("%s%03d\n",String.format("%0$-15s", language),mark);
                
            }
            System.out.println("================================");
 
    }
}

入力は文字列と数値である必要があります

入力例:Google 1

于 2015-08-17T07:42:18.133 に答える
14
String.format("%15s",s) // pads left
String.format("%-15s",s) // pads right

ここに素晴らしい要約

于 2020-01-01T12:09:42.823 に答える
13
import org.apache.commons.lang3.StringUtils;

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

StringUtils.leftPad(stringToPad, maxPadLength, paddingCharacter)

グアバイモよりもはるかに優れています。Guavaを使用する単一のエンタープライズJavaプロジェクトは見たことがありませんが、ApacheStringUtilsは非常に一般的です。

于 2015-01-23T20:09:04.007 に答える
12

以下のような簡単なメソッドを書くこともできます

public static String padString(String str, int leng) {
        for (int i = str.length(); i <= leng; i++)
            str += " ";
        return str;
    }
于 2013-03-21T18:09:41.360 に答える
11

GuavaライブラリにはStrings.padStartがあり、他の多くの便利なユーティリティとともに、必要なことを正確に実行します。

于 2012-11-20T17:16:37.170 に答える
7

ここに巧妙なトリックがあります:

// 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();
  }
}
于 2012-11-20T16:41:08.220 に答える
4

これがテストケースのコードです;):

@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が好きです;)

于 2014-03-05T12:52:41.233 に答える
2

Apacheの一般的なlang3依存関係のStringUtilsは、左/右のパディングを解決するために存在します

Apache.common.lang3StringUtilsは、次のメソッドを使用して、好みの文字で左パディングできるクラスを提供します。

StringUtils.leftPad(final String str, final int size, final char padChar);

ここで、これは静的メソッドとパラメータです

  1. str-文字列はパッドである必要があります(nullにすることができます)
  2. サイズ-パッドするサイズ
  3. padCharで埋める文字

そのStringUtilsクラスにも追加のメソッドがあります。

  1. rightPad
  2. 繰り返す
  3. さまざまな結合方法

参考までに、ここにGradleの依存関係を追加します。

    implementation 'org.apache.commons:commons-lang3:3.12.0'

https://mvnrepository.com/artifact/org.apache.commons/commons-lang3/3.12.0

このクラスのすべてのutilsメソッドを参照してください。

https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html

GUAVAライブラリの依存関係

これはjricherの答えからです。GuavaライブラリにはStrings.padStartがあり、他の多くの便利なユーティリティとともに、必要なことを正確に実行します。

于 2021-09-24T04:27:59.900 に答える
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";

ハッピーコーディング!!

于 2017-10-09T07:46:25.470 に答える
0
public static String padString(String word, int length) {
    String newWord = word;
    for(int count = word.length(); count < length; count++) {
        newWord = " " + newWord;
    }
    return newWord;
}
于 2016-12-15T23:09:02.470 に答える
0

この単純な関数は私のために働きます:

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

呼び出し:

String s = leftPad(myString, 10, "0");
于 2020-01-25T13:50:12.167 に答える
0
public class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < 3; i++) {
            int s;
            String s1 = sc.next();
            int x = sc.nextInt();
            System.out.printf("%-15s%03d\n", s1, x);
            // %-15s -->pads right,%15s-->pads left
        }
    }
}

ライブラリを使用printf()せずに出力を単純にフォーマットするために使用します。

于 2021-03-14T11:03:17.763 に答える