web-dev-qa-db-ja.com

文字列をゼロで左詰めする

ここで ここで似たような質問を見ました

しかし、文字列をゼロで埋める方法を得ていません。

入力: "129018"出力: "0000129018"

合計出力長はTENです。

228
jai

文字列に数字だけが含まれている場合は、それを整数にしてからパディングを行うことができます。

String.format("%010d", Integer.parseInt(mystring));

そうでなければ どうすればいいのか知りたいのですが

327
khachik
String paddedString = org.Apache.commons.lang.StringUtils.leftPad("129018", 10, "0")

2番目のパラメータは希望する出力長です。

"0"はパディング文字です

134
Oliver Michels

これは、解析エラーを心配せずに、任意の文字列を合計10の幅まで埋めます。

String unpadded = "12345"; 
String padded = "##########".substring(unpadded.length()) + unpadded;

//unpadded is "12345"
//padded   is "#####12345"

あなたが正しいパディングしたい場合は:

String unpadded = "12345"; 
String padded = unpadded + "##########".substring(unpadded.length());

//unpadded is "12345"
//padded   is "12345#####"  

"#"文字は、文字列の幅全体にしたい回数だけ繰り返して、埋め込む文字に置き換えることができます。例えば。文字列全体が15文字の長さになるように左にゼロを追加したい場合は、

String unpadded = "12345"; 
String padded = "000000000000000".substring(unpadded.length()) + unpadded;

//unpadded is "12345"
//padded   is "000000000012345"  

これがkhachikの答えよりも優れているのは、Integer.parseIntが使用されていないためです。これは、例外をスローする可能性があります(たとえば、埋め込む数が12147483647のように大きすぎる場合)。不利な点は、パディングしているものがすでにint型である場合、それをStringに変換して変換する必要があることです。これは望ましくありません。

それで、あなたがそれがint型であることを確実に知っていれば、khachikの答えはとてもうまくいきます。そうでなければ、これは可能な戦略です。

98
Rick Hanlon II
String str = "129018";
StringBuilder sb = new StringBuilder();

for (int toPrepend=10-str.length(); toPrepend>0; toPrepend--) {
    sb.append('0');
}

sb.append(str);
String result = sb.toString();
51
thejh
String str = "129018";
String str2 = String.format("%10s", str).replace(' ', '0');
System.out.println(str2);
49
Satish

あなたはApache commons StringUtilsを使うことができます

StringUtils.leftPad("129018", 10, "0");

https://commons.Apache.org/proper/commons-lang/javadocs/api-2.6/org/Apache/commons/lang/StringUtils.html#leftPad(Java.lang.String) 、%20int、%20char)

14
thk

文字列をフォーマットするには

import org.Apache.commons.lang.StringUtils;

public class test {

    public static void main(String[] args) {

        String result = StringUtils.leftPad("wrwer", 10, "0");
        System.out.println("The String : " + result);

    }
}

出力:ストリング:00000wrwer

最初の引数がフォーマットされる文字列の場合、2番目の引数は目的の出力長の長さ、3番目の引数は文字列が埋め込まれる文字列です。

リンクを使用してjarファイルをダウンロードしますhttp://commons.Apache.org/proper/commons-lang/download_lang.cgi

13
Nagarajan S R

パフォーマンスが必要で文字列の最大サイズがわかっている場合は、これを使用してください。

String zeroPad = "0000000000000000";
String str0 = zeroPad.substring(str.length()) + str;

最大文字列サイズに注意してください。もしそれがStringBufferのサイズより大きければ、あなたはJava.lang.StringIndexOutOfBoundsExceptionを得るでしょう。

10
Haroldo Macedo

Google Guava を使用します。

Maven:

<dependency>
     <artifactId>guava</artifactId>
     <groupId>com.google.guava</groupId>
     <version>14.0.1</version>
</dependency>

サンプルコード:

Strings.padStart("129018", 10, '0') returns "0000129018"  
4
Tho

昔の質問ですが、私も2つの方法があります。


固定(定義済み)長さの場合

    public static String fill(String text) {
        if (text.length() >= 10)
            return text;
        else
            return "0000000000".substring(text.length()) + text;
    }

可変長の場合

    public static String fill(String text, int size) {
        StringBuilder builder = new StringBuilder(text);
        while (builder.length() < size) {
            builder.append('0');
        }
        return builder.toString();
    }
4

私はこのコードが好きです:

public final class StrMgr {

    public static String rightPad(String input, int length, String fill){                   
        String pad = input.trim() + String.format("%"+length+"s", "").replace(" ", fill);
        return pad.substring(0, length);              
    }       

    public static String leftPad(String input, int length, String fill){            
        String pad = String.format("%"+length+"s", "").replace(" ", fill) + input.trim();
        return pad.substring(pad.length() - length, pad.length());
    }
}

その後:

System.out.println(StrMgr.leftPad("hello", 20, "x")); 
System.out.println(StrMgr.rightPad("hello", 20, "x"));
3
strobering

@ HaroldoMacêdoの答え に基づいて、私は以下のような私のカスタムUtilsクラスにメソッドを作成しました。

/**
 * Left padding a string with the given character
 *
 * @param str     The string to be padded
 * @param length  The total fix length of the string
 * @param padChar The pad character
 * @return The padded string
 */
public static String padLeft(String str, int length, String padChar) {
    String pad = "";
    for (int i = 0; i < length; i++) {
        pad += padChar;
    }
    return pad.substring(str.length()) + str;
}

それからUtils.padLeft(str, 10, "0");を呼び出します

2
Sithu

これは別のアプローチです:

int pad = 4;
char[] temp = (new String(new char[pad]) + "129018").toCharArray()
Arrays.fill(temp, 0, pad, '0');
System.out.println(temp)
2
nullpotent

これが私の解決策です:

String s = Integer.toBinaryString(5); //Convert decimal to binary
int p = 8; //preferred length
for(int g=0,j=s.length();g<p-j;g++, s= "0" + s);
System.out.println(s);

出力:00000101

2
sh3r1

Satishによる解決策は、期待される答えの中で非常に優れています。 10文字の代わりに変数nをフォーマット文字列に追加して、より一般的にしたいと思いました。

int maxDigits = 10;
String str = "129018";
String formatString = "%"+n+"s";
String str2 = String.format(formatString, str).replace(' ', '0');
System.out.println(str2);

これはほとんどの状況で機能します

1
Prabhu

固定長10の右パディング:String.format( "%1 $ -10s"、 "abc")固定長10の左パディング:String.format( "%1 $ 10s"、 "abc")

1
Arun

これはString.formatをベースにした解決策で、文字列に対して機能し、可変長に適しています。

public static String PadLeft(String stringToPad, int padToLength){
    String retValue = null;
    if(stringToPad.length() < padToLength) {
        retValue = String.format("%0" + String.valueOf(padToLength - stringToPad.length()) + "d%s",0,stringToPad);
    }
    else{
        retValue = stringToPad;
    }
    return retValue;
}

public static void main(String[] args) {
    System.out.println("'" + PadLeft("test", 10) + "'");
    System.out.println("'" + PadLeft("test", 3) + "'");
    System.out.println("'" + PadLeft("test", 4) + "'");
    System.out.println("'" + PadLeft("test", 5) + "'");
}

出力: '000000test' 'test' 'test' '0test'

0
P.V.M. Kessels
    int number = -1;
    int holdingDigits = 7;
    System.out.println(String.format("%0"+ holdingDigits +"d", number));

ただインタビューでこれを尋ねた........

私の答えは以下ですが、これは(上記の)非常に良いです - >

String.format("%05d", num);

私の答えは:

static String leadingZeros(int num, int digitSize) {
    //test for capacity being too small.

    if (digitSize < String.valueOf(num).length()) {
        return "Error : you number  " + num + " is higher than the decimal system specified capacity of " + digitSize + " zeros.";

        //test for capacity will exactly hold the number.
    } else if (digitSize == String.valueOf(num).length()) {
        return String.valueOf(num);

        //else do something here to calculate if the digitSize will over flow the StringBuilder buffer Java.lang.OutOfMemoryError 

        //else calculate and return string
    } else {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < digitSize; i++) {
            sb.append("0");
        }
        sb.append(String.valueOf(num));
        return sb.substring(sb.length() - digitSize, sb.length());
    }
}
0
bockymurphy

整数と文字列で動作する私のコードを確認してください。

最初の数字を129018とします。最後の文字列の長さが10になるように0を追加します。そのためには、次のコードを使用します。

    int number=129018;
    int requiredLengthAfterPadding=10;
    String resultString=Integer.toString(number);
    int inputStringLengh=resultString.length();
    int diff=requiredLengthAfterPadding-inputStringLengh;
    if(inputStringLengh<requiredLengthAfterPadding)
    {
        resultString=new String(new char[diff]).replace("\0", "0")+number;
    }        
    System.out.println(resultString);
0
Fathah Rehman P