整数の左側にゼロを埋め込むにはどうすればよいですか?


1022

Javaでintaに変換するときに、どうやってan にゼロStringを埋め込むのですか?

私は基本的に整数まで9999先行ゼロを埋め込もうとしています(例えば1 = 0001)。


2
うん、それだけです!私の悪い…私は私の電話でそれをタイプした。「新しい文字列」も必要ありません。Integer.toString(num + 10000).subString(1)が機能します。
Randyaa 2014

Long.valueOf( "00003400")。toString(); Integer.valueOf( "00003400")。toString(); ---> 3400
フリーケル、2015

1
ダイアグラムのあるソリューションについては、stackoverflow.com
questions / 35521278 /…

が9999より大きいnew String(Integer.toString(num + 10000)).substring(1)場合、アプローチに問題がありnumます(ijs)。
フェリペ2016年

回答:


1696

java.lang.String.format(String,Object...)このように使用してください:

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

長さが5のゼロ埋め込みの場合。16進出力の場合は、dxas inに置き換え"%05x"ます。

完全な書式設定オプションは、の一部として文書化されていますjava.util.Formatter


1
のオプションString.formatはCのprintf()に似ていると思いますか?
Ehtesh Choudhury、2011

13
大きな値のリストに対してこれを行う必要がある場合、DecimalFormatのパフォーマンスはString.format()よりも少なくとも3倍優れています。私は自分でいくつかのパフォーマンスチューニングを行っており、2つをVisual VMで実行すると、String.format()メソッドがDecimalFormat.format()の約3〜4倍の速度でCPU時間を累積することが示されます。
スティーブファーガソン2013年

10
9個を超えるゼロを追加するには、次のようなものを使用します%012d
Mohammad Banisaeid

2
これはJava 5以降用です。1.4以下の場合、DecimalFormatは、ここに示されているように代替手段ですjavadevnotes.com/java-integer-to-string-with-leading-zeros
JavaDev

1
こんにちは、みんな!:私は使用していくつかの問題を抱えて%d can't format java.lang.String arguments
エリオ・ソアレスジュニア

116

11として印刷したいとしましょう011

あなたは、フォーマッタを使用することができます"%03d"

ここに画像の説明を入力してください

このフォーマッタは次のように使用できます。

int a = 11;
String with3digits = String.format("%03d", a);
System.out.println(with3digits);

あるいは、一部のJavaメソッドはこれらのフォーマッターを直接サポートします。

System.out.printf("%03d", a);

5
@Omar Kooheiは確かに、「魔法の定数」の背後にある理由を説明しています。
bvdb 2016

いい答えだ!ただのコメントFです。format()はf:で なければなりませんString.format(...);
David Miguel

先頭に0を追加したくないが、別の文字/数字を追加したい場合はどうなりますか?ありがとう
chiperortiz

1
@chiperortiz申し訳ありませんが、上記のフォーマットツールでは不可能です。その場合、必要な先行文字(例:)を計算しint prefixLength = requiredTotalLength - String.valueOf(numericValue).length、繰り返し文字列メソッドを使用して必要なプレフィックスを作成します。私の知る限りで、繰り返し文字列には、さまざまな方法がありますが、ネイティブJava 1はありません。stackoverflow.com/questions/1235179/...
bvdb

114

何らかの理由で1.5より前のJavaを使用している場合は、Apache Commons Langメソッドを試すことができます

org.apache.commons.lang.StringUtils.leftPad(String str, int size, '0')

29

この例が見つかりました...テストします...

import java.text.DecimalFormat;
class TestingAndQualityAssuranceDepartment
{
    public static void main(String [] args)
    {
        int x=1;
        DecimalFormat df = new DecimalFormat("00");
        System.out.println(df.format(x));
    }
}

これをテストして:

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

どちらも機能しますが、私の目的では、String.Formatの方が優れていて、簡潔です。


1
はい、私はString.formatについて知らなかったのでDecimalFormatを提案しようとしましたが、それからuzhinの答えを見ました。String.formatは新しいものでなければなりません。
ポールトンブリン

これは、.Netでの方法と似ていますが、.Netの方法は、小さい数の方が見栄えがよい点が異なります。
Omar Kooheji

私の場合、私の番号がDoubleだったため、最初のオプション(DecimalFormat)を使用しました
mauronet

21

あなたのケースでパフォーマンスが重要な場合は、String.format関数と比べて少ないオーバーヘッドで自分で行うことができます:

/**
 * @param in The integer value
 * @param fill The number of digits to fill
 * @return The given value left padded with the given number of digits
 */
public static String lPadZero(int in, int fill){

    boolean negative = false;
    int value, len = 0;

    if(in >= 0){
        value = in;
    } else {
        negative = true;
        value = - in;
        in = - in;
        len ++;
    }

    if(value == 0){
        len = 1;
    } else{         
        for(; value != 0; len ++){
            value /= 10;
        }
    }

    StringBuilder sb = new StringBuilder();

    if(negative){
        sb.append('-');
    }

    for(int i = fill; i > len; i--){
        sb.append('0');
    }

    sb.append(in);

    return sb.toString();       
}

パフォーマンス

public static void main(String[] args) {
    Random rdm;
    long start; 

    // Using own function
    rdm = new Random(0);
    start = System.nanoTime();

    for(int i = 10000000; i != 0; i--){
        lPadZero(rdm.nextInt(20000) - 10000, 4);
    }
    System.out.println("Own function: " + ((System.nanoTime() - start) / 1000000) + "ms");

    // Using String.format
    rdm = new Random(0);        
    start = System.nanoTime();

    for(int i = 10000000; i != 0; i--){
        String.format("%04d", rdm.nextInt(20000) - 10000);
    }
    System.out.println("String.format: " + ((System.nanoTime() - start) / 1000000) + "ms");
}

結果

独自機能: 1697ms

String.format: 38134ms


1
上記では、DecimalFormatを使用する方が高速であるという説明があります。何かメモはありましたか?
Patrick

@Patrick用のDecimalFormat性能も参照:stackoverflow.com/questions/8553672/...
ステファン

ショッキング!機能が非常にうまくいかないのはナッツです。1から3桁の範囲の符号なし整数のコレクションをゼロで埋めて表示する必要がありました。それは電光石火を速く働かせる必要がありました。私はこの単純な方法を使用しました。for( int i : data ) strData += (i > 9 ? (i > 99 ? "" : "0") : "00") + Integer.toString( i ) + "|";それは非常に迅速に機能しました(残念ながら時間を計らなかった!)
BuvinJ 2017

HotSpotでクラックが発生するほど実行した後のパフォーマンスはどのように比較されますか?
Phil

16

Google Guavaを使用できます。

Maven:

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

サンプルコード:

String paddedString1 = Strings.padStart("7", 3, '0'); //"007"
String paddedString2 = Strings.padStart("2020", 3, '0'); //"2020"

注意:

Guavaそれはまたに関連した機能の多くを提供し、非常に便利なライブラリですCollectionsCachesFunctional idiomsConcurrencyStringsPrimitivesRangesIOHashingEventBus、など

参照: GuavaExplained


1
上記のサンプルコードは使用法のみで、実際のサンプルコードではありません。コメントはこれを反映しているため、「String myPaddedString = Strings.padStart(...)」が必要になります
JoeG

2
このメソッドは、実際にはJDK String.format / MessageFormatter / DecimalFormatterよりもはるかに優れたパフォーマンス結果を提供します。
rafalmag

10

これを試してください:

import java.text.DecimalFormat; 

DecimalFormat df = new DecimalFormat("0000");
String c = df.format(9);   // 0009
String a = df.format(99);  // 0099
String b = df.format(999); // 0999

3

上記のアプローチの多くは優れていますが、浮動小数点数だけでなく整数もフォーマットする必要がある場合があります。これは、特に10進数の右側と同様に左側に特定の数のゼロを埋め込む必要がある場合に使用できます。

import java.text.NumberFormat;  
public class NumberFormatMain {  

public static void main(String[] args) {  
    int intNumber = 25;  
    float floatNumber = 25.546f;  
    NumberFormat format=NumberFormat.getInstance();  
    format.setMaximumIntegerDigits(6);  
    format.setMaximumFractionDigits(6);  
    format.setMinimumFractionDigits(6);  
    format.setMinimumIntegerDigits(6);  

    System.out.println("Formatted Integer : "+format.format(intNumber).replace(",",""));  
    System.out.println("Formatted Float   : "+format.format(floatNumber).replace(",",""));  
 }    
}  

2
int x = 1;
System.out.format("%05d",x);

書式設定されたテキストを画面に直接印刷する場合。


1
しかし、OPはそれを要求しませんでした。内部的には同じ実装String.formatSystem.out.format呼び出しjava.util.Formatterます。
bsd 2013

...およびSystem.outはリダイレクトできます。
Phil

1

次のようにクラスDecimalFormatを使用します。

NumberFormat formatter = new DecimalFormat("0000"); //i use 4 Zero but you can also another number
System.out.println("OUTPUT : "+formatter.format(811)); 

出力: 0000811


1

これは、を使用せずに文字列をフォーマットする方法ですDecimalFormat

String.format("%02d", 9)

09

String.format("%03d", 19)

019

String.format("%04d", 119)

0119


0

整数と文字列で機能するコードを確認してください。

最初の数が2であると仮定します。それにゼロを追加して、最終的な文字列の長さが4になるようにします。そのためには、次のコードを使用できます。

    int number=2;
    int requiredLengthAfterPadding=4;
    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);

(new char[diff])理由
Isaac

replace("\0", "0")何が...何ですか
アイザック

@Isaac-最初にchar配列を作成し、そのchar配列を使用して文字列を作成しました。次に、null文字(char型のデフォルト値)を "0"(パディングにここで必要な文字)に
置き換えました

0

フォーマッタを使用する必要があります。次のコードはNumberFormatを使用しています

    int inputNo = 1;
    NumberFormat nf = NumberFormat.getInstance();
    nf.setMaximumIntegerDigits(4);
    nf.setMinimumIntegerDigits(4);
    nf.setGroupingUsed(false);

    System.out.println("Formatted Integer : " + nf.format(inputNo));

出力:0001


-2
public static String zeroPad(long number, int width) {
   long wrapAt = (long)Math.pow(10, width);
   return String.valueOf(number % wrapAt + wrapAt).substring(1);
}

このアプローチの唯一の問題は、それがあなたがそれがどのように機能するかを理解するためにあなたの思考の帽子をかぶらせることです。


5
唯一の問題?負でそれを試してみnumberたりしてwidth18より大きい
user85421

2
いい視点ね。そして、幅で切り捨てられるため、要求された以上のことをしていると思います(これは明示的に要求されていませんが、通常は必要です)。Javaの(比較すると痛々しいほど遅い)String.format()が変数の幅をサポートせず、整数指定子の精度をまったくサポートしないのは残念です。
johncurrier

-3

パッケージは必要ありません:

String paddedString = i < 100 ? i < 10 ? "00" + i : "0" + i : "" + i;

これにより、文字列が3文字になるようにパディングされ、4〜5文字のパートを簡単に追加できます。これは決して完璧な解決策ではないことを知っていますが(特に、大きな埋め込み文字列が必要な場合)、私はそれが好きです。


1
うーん...私はそれが好きです。
Kartik Chugh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.