474

Javaで文字列をパディングする簡単な方法はありますか?

StringUtil のような API にあるはずの何かのようですが、これを行うものは見つかりません。

4

30 に答える 30

691

Java 1.5 以降String.format()、特定の文字列の左右のパディングに使用できます。

public static String padRight(String s, int n) {
     return String.format("%-" + n + "s", s);  
}

public static String padLeft(String s, int n) {
    return String.format("%" + n + "s", s);  
}

...

public static void main(String args[]) throws Exception {
 System.out.println(padRight("Howto", 20) + "*");
 System.out.println(padLeft("Howto", 20) + "*");
}

出力は次のとおりです。

Howto               *
               Howto*
于 2008-12-24T18:21:54.493 に答える
275

10 文字までのパディング:

String.format("%10s", "foo").replace(' ', '*');
String.format("%-10s", "bar").replace(' ', '*');
String.format("%10s", "longer than 10 chars").replace(' ', '*');

出力:

  *******foo
  bar*******
  longer*than*10*chars

パスワードの文字に「*」を表示:

String password = "secret123";
String padded = String.format("%"+password.length()+"s", "").replace(' ', '*');

出力はパスワード文字列と同じ長さです:

  secret123
  *********
于 2011-05-31T09:13:08.153 に答える
200

ApacheStringUtilsにはleftPad、 、rightPadcenterおよびrepeat.

ただし、他の人がこの回答で言及および実証しているように、JDKString.format()Formatterクラスがより良いオプションであることに注意してください。コモンズコードでそれらを使用してください。

于 2008-12-23T09:22:07.563 に答える
88

Guavaでは、これは簡単です:

Strings.padStart("string", 10, ' ');
Strings.padEnd("string", 10, ' ');
于 2011-09-21T15:56:44.543 に答える
26

をご覧くださいorg.apache.commons.lang.StringUtils#rightPad(String str, int size, char padChar)

しかし、アルゴリズムは非常に単純です (サイズ文字までパディングします):

public String pad(String str, int size, char padChar)
{
  StringBuilder padded = new StringBuilder(str);
  while (padded.length() < size)
  {
    padded.append(padChar);
  }
  return padded.toString();
}
于 2008-12-23T09:24:38.683 に答える
22

Apache Commons の他にString.format、単純なパディング (スペースなど) を処理できるものも参照してください。

于 2008-12-23T09:24:20.493 に答える
16
public static String LPad(String str, Integer length, char car) {
  return (str + String.format("%" + length + "s", "").replace(" ", String.valueOf(car))).substring(0, length);
}

public static String RPad(String str, Integer length, char car) {
  return (String.format("%" + length + "s", "").replace(" ", String.valueOf(car)) + str).substring(str.length(), length + str.length());
}

LPad("Hi", 10, 'R') //gives "RRRRRRRRHi"
RPad("Hi", 10, 'R') //gives "HiRRRRRRRR"
RPad("Hi", 10, ' ') //gives "Hi        "
RPad("Hi", 1, ' ')  //gives "H"
//etc...
于 2012-02-09T17:22:06.493 に答える
7

このスレッドは古く、元の質問は簡単な解決策でしたが、本当に高速であると思われる場合は、char 配列を使用する必要があります。

public static String pad(String str, int size, char padChar)
{
    if (str.length() < size)
    {
        char[] temp = new char[size];
        int i = 0;

        while (i < str.length())
        {
            temp[i] = str.charAt(i);
            i++;
        }

        while (i < size)
        {
            temp[i] = padChar;
            i++;
        }

        str = new String(temp);
    }

    return str;
}

フォーマッタ ソリューションは最適ではありません。フォーマット文字列を構築するだけで、2 つの新しい文字列が作成されます。

Apacheのソリューションは、sbをターゲットサイズで初期化することで改善できるため、以下を置き換えます

StringBuffer padded = new StringBuffer(str); 

StringBuffer padded = new StringBuffer(pad); 
padded.append(value);

sb の内部バッファーが大きくなるのを防ぎます。

于 2010-10-28T14:34:48.523 に答える
6

これを理解するのに少し時間がかかりました。本当の鍵は、そのフォーマッターのドキュメントを読むことです。

// Get your data from wherever.
final byte[] data = getData();
// Get the digest engine.
final MessageDigest md5= MessageDigest.getInstance("MD5");
// Send your data through it.
md5.update(data);
// Parse the data as a positive BigInteger.
final BigInteger digest = new BigInteger(1,md5.digest());
// Pad the digest with blanks, 32 wide.
String hex = String.format(
    // See: http://download.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html
    // Format: %[argument_index$][flags][width]conversion
    // Conversion: 'x', 'X'  integral    The result is formatted as a hexadecimal integer
    "%1$32x",
    digest
);
// Replace the blank padding with 0s.
hex = hex.replace(" ","0");
System.out.println(hex);
于 2010-10-29T20:58:09.183 に答える
5

右にパディングする別の方法を次に示します。

// put the number of spaces, or any character you like, in your paddedString

String paddedString = "--------------------";

String myStringToBePadded = "I like donuts";

myStringToBePadded = myStringToBePadded + paddedString.substring(myStringToBePadded.length());

//result:
myStringToBePadded = "I like donuts-------";
于 2011-09-21T15:45:45.857 に答える
4

毎回再構築するのではなく、パディング データを保持することで、呼び出しごとのオーバーヘッドを削減できます。

public class RightPadder {

    private int length;
    private String padding;

    public RightPadder(int length, String pad) {
        this.length = length;
        StringBuilder sb = new StringBuilder(pad);
        while (sb.length() < length) {
            sb.append(sb);
        }
        padding = sb.toString();
   }

    public String pad(String s) {
        return (s.length() < length ? s + padding : s).substring(0, length);
    }

}

別の方法として、結果の長さをpad(...)メソッドのパラメーターにすることもできます。その場合、コンストラクターではなくそのメソッドで隠しパディングの調整を行います。

(ヒント: 追加のクレジットとして、スレッドセーフにしてください! ;-)

于 2008-12-23T14:25:42.257 に答える
2

これは機能します:

"".format("%1$-" + 9 + "s", "XXX").replaceAll(" ", "0")

最大 9 文字の文字列 XXX を空白で埋めます。その後、すべての空白は 0 に置き換えられます。空白と 0 は任意のものに変更できます...

于 2011-05-11T14:30:17.743 に答える
2

組み込みの StringBuilder の append() および insert() メソッドを使用して、可変長の文字列のパディングを行うことができます。

AbstractStringBuilder append(CharSequence s, int start, int end) ;

例えば:

private static final String  MAX_STRING = "                    "; //20 spaces

    Set<StringBuilder> set= new HashSet<StringBuilder>();
    set.add(new StringBuilder("12345678"));
    set.add(new StringBuilder("123456789"));
    set.add(new StringBuilder("1234567811"));
    set.add(new StringBuilder("12345678123"));
    set.add(new StringBuilder("1234567812234"));
    set.add(new StringBuilder("1234567812222"));
    set.add(new StringBuilder("12345678122334"));

    for(StringBuilder padMe: set)
        padMe.append(MAX_STRING, padMe.length(), MAX_STRING.length());
于 2010-08-24T10:55:49.627 に答える
2

多くの人がいくつかの非常に興味深いテクニックを持っていますが、私はシンプルに保つのが好きなので、これを使います:

public static String padRight(String s, int n, char padding){
    StringBuilder builder = new StringBuilder(s.length() + n);
    builder.append(s);
    for(int i = 0; i < n; i++){
        builder.append(padding);
    }
    return builder.toString();
}

public static String padLeft(String s, int n,  char padding) {
    StringBuilder builder = new StringBuilder(s.length() + n);
    for(int i = 0; i < n; i++){
        builder.append(Character.toString(padding));
    }
    return builder.append(s).toString();
}

public static String pad(String s, int n, char padding){
    StringBuilder pad = new StringBuilder(s.length() + n * 2);
    StringBuilder value = new StringBuilder(n);
    for(int i = 0; i < n; i++){
        pad.append(padding);
    }
    return value.append(pad).append(s).append(pad).toString();
}
于 2015-08-28T16:58:55.157 に答える
2
public static String padLeft(String in, int size, char padChar) {                
    if (in.length() <= size) {
        char[] temp = new char[size];
        /* Llenado Array con el padChar*/
        for(int i =0;i<size;i++){
            temp[i]= padChar;
        }
        int posIniTemp = size-in.length();
        for(int i=0;i<in.length();i++){
            temp[posIniTemp]=in.charAt(i);
            posIniTemp++;
        }            
        return new String(temp);
    }
    return "";
}
于 2011-08-24T17:36:51.160 に答える
2

java.util.Formatter左右のパディングを行います。奇妙なサードパーティの依存関係は必要ありません (些細なことのためにそれらを追加したいですか)。

[詳細は省き、この投稿を「コミュニティ ウィキ」にしました。これは、私が必要としているものではないためです。]

于 2008-12-23T14:58:42.737 に答える
-1

簡単な解決策は次のとおりです。

package nl;
public class Padder {
    public static void main(String[] args) {
        String s = "123" ;
        System.out.println("#"+("     " + s).substring(s.length())+"#");
    }
}
于 2012-01-19T12:24:53.450 に答える
-2

How is this

String is "hello" and required padding is 15 with "0" left pad

String ax="Hello";
while(ax.length() < 15) ax="0"+ax;
于 2013-03-28T11:53:39.633 に答える