web-dev-qa-db-ja.com

Javaで文字列を埋めるにはどうすればいいですか?

Javaで文字列を埋める簡単な方法はありますか?

StringUtilのようなAPIに含まれるべきもののように思えますが、これを行うものが見つかりません。

384
pvgoddijn

Apache StringUtils にはいくつかのメソッドがあります: leftPadrightPadcenter および repeat

しかし、他の人が この回答 で説明しているように、JDKのString.format()クラスとFormatterクラスがより良い選択肢です。コモンズコードの上にそれらを使用してください。

166
GaryF

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*
580
RealHowTo

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
  *********
239
leo

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

Strings.padStart("string", 10, ' ');
Strings.padEnd("string", 10, ' ');
86
Garrett Hall

簡単なこと:

値は文字列です。そうでなければ、文字列に変換します。 "" + 123Integer.toString(123)のように

// let's assume value holds the String we want to pad
String value = "123";

部分文字列は、値の長さがcharのインデックスから始まり、パディングの最後の長さまでです。

String padded="00000000".substring(value.length()) + value;

// now padded is "00000123"

より正確な

右パッド:

String padded = value + ("ABCDEFGH".substring(value.length())); 

// now padded is "123DEFGH"

左パッド:

String padString = "ABCDEFGH";
String padded = (padString.substring(0, padString.length() - value.length())) + value;

// now padded is "ABCDE123"
30
Shimon Doodkin

org.Apache.commons.lang.StringUtils#rightPad(String str, int size, char padChar)を見てください。

しかし、アルゴリズムは非常に単純です(サイズ文字まで右詰め)。

public String pad(String str, int size, char padChar)
{
  StringBuffer padded = new StringBuffer(str);
  while (padded.length() < size)
  {
    padded.append(padChar);
  }
  return padded.toString();
}
22
Arne Burmeister

Apache Commonsの他に、String.formatも見てください。これは、単純なパディング(例えばスペース)を処理できるはずです。

21
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...
16
Eduardo

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

// 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);
7
Nthalk

私は、このスレッドが古く、元々の質問は簡単な解決策であったことを知っていますが、本当に速いと思われる場合は、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の内部バッファが大きくなるのを防ぎます。

6
ck.

これは右にパディングするための別の方法です:

// 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-------";
5
fawsha1

毎回再構築するのではなく、パディングデータを保持することでコールごとのオーバーヘッドを減らすことができます。

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(...)メソッドのパラメータにすることもできます。その場合は、コンストラクタではなくそのメソッドで隠しパディングの調整を行います。

(ヒント:余計なことに、スレッドセーフにしてください!;-)

4
joel.neely

これを Dzone に見つけた

ゼロで埋めます。

String.format("|%020d|", 93); // prints: |00000000000000000093|
3
OJVM
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 "";
}
2
Marlon Tarax

可変長文字列長のパディングには、組み込みの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());
2
ef_oren

これは動作します:

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

それは空白文字で9文字まであなたの文字列XXXを埋めるでしょう。その後、すべての空白は0に置き換えられます。空白と0は、必要なものに変更できます。

2
Sebastian S.

@ck@Marlon Tarak の答えがchar[]を使用する唯一のものです。これは、1秒間にパディングメソッドを複数回呼び出すアプリケーションに最適です。しかし、それらは配列操作の最適化を利用しておらず、私の好みでは少し上書きされています。これは、 ループなしで で実行できます。

public static String pad(String source, char fill, int length, boolean right){
    if(source.length() > length) return source;
    char[] out = new char[length];
    if(right){
        System.arraycopy(source.toCharArray(), 0, out, 0, source.length());
        Arrays.fill(out, source.length(), length, fill);
    }else{
        int sourceOffset = length - source.length();
        System.arraycopy(source.toCharArray(), 0, out, sourceOffset, source.length());
        Arrays.fill(out, 0, sourceOffset, fill);
    }
    return new String(out);
}

簡単な試験方法:

public static void main(String... args){
    System.out.println("012345678901234567890123456789");
    System.out.println(pad("cats", ' ', 30, true));
    System.out.println(pad("cats", ' ', 30, false));
    System.out.println(pad("cats", ' ', 20, false));
    System.out.println(pad("cats", '$', 30, true));
    System.out.println(pad("too long for your own good, buddy", '#', 30, true));
}

出力:

012345678901234567890123456789
cats                          
                          cats
                cats
cats$$$$$$$$$$$$$$$$$$$$$$$$$$
too long for your own good, buddy 
2
ndm13

別の文字列に連結する前に左右のパディング(またはプレフィックス/サフィックスの文字列またはスペース)を与え、長さやif条件をテストしたくない場合があるので、答えを残しましょう。

選択された答えと同じように、私はApache CommonsのStringUtilsを好むでしょうが、この方法を使います:

StringUtils.defaultString(StringUtils.leftPad(myString, 1))

説明する:

  • myString:入力した文字列、nullも可
  • StringUtils.leftPad(myString, 1):文字列がnullの場合、このステートメントもnullを返します
  • それからdefaultStringを使って空の文字列を与え、連結nullを防ぎます
2
Osify

Java 11以降、String.repeat(int)を使用して特定の文字列を左右に埋め込むことができます。

System.out.println("*".repeat(5)+"Apple");
System.out.println("Apple"+"*".repeat(5));

出力:

*****Apple
apple*****
1
Eko Setiawan

多くの人がとても面白いテクニックを持っていますが、私はこれを単純にしておくことが好きです。

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();
}
1
Aelphaeis

Java.util.Formatterは左右のパディングを行います。変わったサードパーティの依存関係は必要ありません(それほど簡単なものではありませんか?).

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

この機能を使用してください。

private String leftPadding(String Word, int length, char ch) {
   return (length > Word.length()) ? leftPadding(ch + Word, length, ch) : Word;
}

使い方?

leftPadding(month, 2, '0');

出力:01 02 03 04 .. 11 12

1
Samet öztoprak

すべての 文字列 操作は通常非常に効率的である必要があります - 特に大量のデータを扱う場合は - 私はあなたがplsql padコマンドで得られるものに似た、速くて柔軟なものが欲しかった。また、私は一つの小さなことだけのために巨大なライブラリを含めたくありません。これらを考慮すると、これらの解決法のどれも満足のいくものではなかった。これは私が思い付いた解決策です、それは最高のベンチマーキング結果を持っていました、誰かがそれを改善することができるならば、あなたのコメントを加えてください。

public static char[] lpad(char[] pStringChar, int pTotalLength, char pPad) {
    if (pStringChar.length < pTotalLength) {
        char[] retChar = new char[pTotalLength];
        int padIdx = pTotalLength - pStringChar.length;
        Arrays.fill(retChar, 0, padIdx, pPad);
        System.arraycopy(pStringChar, 0, retChar, padIdx, pStringChar.length);
        return retChar;
    } else {
        return pStringChar;
    }
}
  • これはString.toCharArray()で呼び出され、結果は新しいString((char [])result)でStringに変換できることに注意してください。これは、複数の操作を適用する場合、それらすべてをchar []で実行でき、フォーマット間の変換を継続できないためです。舞台裏では、Stringはchar []として格納されます。これらの操作がStringクラス自体に含まれていた場合、それは2倍効率的だったでしょう - スピードとメモリの面で。
0
EarlB

Java oneliners、派手なライブラリはありません。

// 6 characters padding example
String pad = "******";
// testcases for 0, 4, 8 characters
String input = "" | "abcd" | "abcdefgh"

左パッド、制限しない

result = pad.substring(Math.min(input.length(),pad.length())) + input;
results: "******" | "**abcd" | "abcdefgh"

右パッド、制限しない

result = input + pad.substring(Math.min(input.length(),pad.length()));
results: "******" | "abcd**" | "abcdefgh"

左にパッド、パッドの長さに制限

result = (pad + input).substring(input.length(), input.length() + pad.length());
results: "******" | "**abcd" | "cdefgh"

右パッド、パッド長に制限

result = (input + pad).substring(0, pad.length());
results: "******" | "abcd**" | "abcdef"
0
leo

単純な解決策 APIなしで は次のようになります。

public String pad(String num, int len){
    if(len-num.length() <=0) return num;
    StringBuffer sb = new StringBuffer();
    for(i=0; i<(len-num.length()); i++){
        sb.append("0");
    }
    sb.append(num);
    return sb.toString();
}
0

再帰の使用はどうですか?以下に示す解決策はすべてのJDKバージョンと互換性があり、外部ライブラリは不要です:)

private static String addPadding(final String str, final int desiredLength, final String padBy) {
        String result = str;
        if (str.length() >= desiredLength) {
            return result;
        } else {
            result += padBy;
            return addPadding(result, desiredLength, padBy);
        }
    }

NOTE:このソリューションはパディングを追加しますが、パッド値にプレフィックスを付けることができます。

0
Saikat Sengupta