先行ゼロでJava文字列をフォーマットする方法は?


191

次に文字列を示します。

"Apple"

そして私は8文字を埋めるためにゼロを追加したいと思います:

"000Apple"

どうすればできますか?

回答:


287

ライブラリの助けを借りずにそれをしなければならない場合:

("00000000" + "Apple").substring("Apple".length())

(文字列が8文字を超えない限り機能します。)


21
かなり賢いですが、「取得」するのに約30秒かかりました。より読みやすいソリューションが良いと思います。
エイミーB

2
これは、スペースのない何かにソフトウェアを埋め込んでいて、追加のライブラリを選択できない場合の、優れたソリューションです。ありがとう!!
Casey Murray、

このバージョンは非常に高速です!大好きです。
ダッカロン2014

2
@Mathu正直に言って、理解するのは難しくありません。2つの文字列が連結(結合)され、最初の5文字がそこから抽出されます。魔法はありません。この場合はあまり賢明ではありませんが(固定ストリングAppleの場合)、理解しやすいです。 ("0000" + theString).substring(theString.length())より現実的です。これtheStringは先行ゼロで埋めます。申し訳ありませんが、このコメントの追加に抵抗できませんでした:)
HankCa 2016

1
このソリューションの構文は短いですが、「非常に高速」ではありません。運が良ければ、コンパイラはそれを最適化しますが、本質的にはこれを行う実際の「高速」な方法はを使用するStringBuilderことであり、ループを埋める必要があります。要件が実際には8文字の文字列のみを切り捨てることで問題ない場合、それは非常に狭いユースケースですが、このソリューションを高速に呼び出すことはできません。短いです。
Dici

319
public class LeadingZerosExample {
    public static void main(String[] args) {
       int number = 1500;

       // String format below will add leading zeros (the %0 syntax) 
       // to the number above. 
       // The length of the formatted string will be 7 characters.

       String formatted = String.format("%07d", number);

       System.out.println("Number with leading zeros: " + formatted);
    }
}

14
しかし、私はintの代わりに文字列の前に先行ゼロを追加したいと思います。
Roy

1
StringUtilsまたはDecimalFormatをJava 1.4以下で使用できます。ここjavadevnotes.com/java-integer-to-string-with-leading-zerosを
JavaDev

3
@Variagの%07s 代わりに使用すると%07dFormatFlagsConversionMismatchException。あなたはそれを試すことができます。
Z fp

127
 StringUtils.leftPad(yourString, 8, '0');

これはcommons-langによるものです。javadocを参照


3
commons-langを使用しないのはなぜですか?便利な追加機能がたくさんあります。
Bozho

7
commons-langを使用できない場合でも、StringUtilsからソースを簡単にコピーして、独自の関数を作成できます。これは、選択した回答よりもはるかに優れた一般的な解決策です。docjar.com/html/api/org/apache/commons/lang/...
kaliatech

3
ライブラリが使用される唯一の方法である場合はどうなりますか?おそらく、追加されたライブラリは、それが使用されているアプリよりも何倍も大きいです。アプリケーションにコモンズライブラリを追加しない理由かなりあると思います。誤解しないでください。私は同意します。非常に便利なものを含んでいますが、1つ(または2つ)のメソッドのみを記述する必要がない場合は、外部JARでアプリをいっぱいにすることをためらうことを理解しています。
Bart Kiers、

2
答えるために、「なぜコモンズ-LANGを使わないのでしょうか?それは便利なエキストラの戦利品を持っています。」具体的な例で質問。Xiaomiは、Androidデバイスにcommons-langの古いバージョンを出荷しています。アプリに新しいバージョンを含めると、クラスローダーの競合が発生するため、commons-langはどのAndroidプロジェクトでも使用できなくなります。
那智

1
古くなったStringUtils.leftPadが存在する必要がある場合でも@Nachi
Lluis Martinez

29

これは彼が私が信じていることを本当に求めていたものです:

String.format("%0"+ (8 - "Apple".length() )+"d%s",0 ,"Apple"); 

出力:

000Apple

一般的なケースでは機能しません。"Apple"を8文字の長さの文字列で置き換える場合(これはOPの場合に可能です)、これはDuplicateFormatFlagsException00フォーマット文字列内にあるため)をスローします。8文字より長い文字列を置き換えると、IllegalFormatFlagsException(負の数のため)がスローされます。
nbrooks

あなたは右ですが、何これについて:String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8); 。これで、この例外はなくなります。
Abhinav Puri 2017

追加したいのString.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8);は間違っていますString.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(1,9);

@ user4231709素晴らしいソリューションです!+1
user1697575

25

別の回答で使用されているString.formatメソッドを使用して、0の文字列を生成できます。

String.format("%0"+length+"d",0)

これは、フォーマット文字列の先頭の0の数を動的に調整することで問題に適用できます。

public String leadingZeros(String s, int length) {
     if (s.length() >= length) return s;
     else return String.format("%0" + (length-s.length()) + "d%s", 0, s);
}

それはまだ厄介なソリューションですが、整数の引数を使用して結果の文字列の全長を指定できるという利点があります。



15

あなたはこれを使うことができます:

org.apache.commons.lang.StringUtils.leftPad("Apple", 8, "0")

断然最良の答えです。Apache commons StringUtilsはシンプルでありながら非常に役立つライブラリです。
ゾイドバーグ2017

これは多くの時間を節約し、それもきれいできれいです。
Abhishek

9

私も同じような状況にあり、これを使用しました。それは非常に簡潔であり、長さや他のライブラリを扱う必要はありません。

String str = String.format("%8s","Apple");
str = str.replace(' ','0');

シンプルで端正です。文字列形式が返される" Apple"ため、スペースをゼロに置き換えた後、目的の結果が得られます。


次に、最初に文字列を分割し、残りの分割値を連結するのではなく、最初の分割値に上記の操作を適用します。
Erdiİzgi18年

6
String input = "Apple";
StringBuffer buf = new StringBuffer(input);

while (buf.length() < 8) {
  buf.insert(0, '0');
}

String output = buf.toString();


1
public class PaddingLeft {
    public static void main(String[] args) {
        String input = "Apple";
        String result = "00000000" + input;
        int length = result.length();
        result = result.substring(length - 8, length);
        System.out.println(result);
    }
}

1

エッジケースの世話をする必要があるかもしれません。これはジェネリックメソッドです。

public class Test {
    public static void main(String[] args){
        System.out.println(padCharacter("0",8,"hello"));
    }
    public static String padCharacter(String c, int num, String str){
        for(int i=0;i<=num-str.length()+1;i++){str = c+str;}
        return str;
    }
}

1
public static void main(String[] args)
{
    String stringForTest = "Apple";
    int requiredLengthAfterPadding = 8;
    int inputStringLengh = stringForTest.length();
    int diff = requiredLengthAfterPadding - inputStringLengh;
    if (inputStringLengh < requiredLengthAfterPadding)
    {
        stringForTest = new String(new char[diff]).replace("\0", "0")+ stringForTest;
    }
    System.out.println(stringForTest);
}

1
public static String lpad(String str, int requiredLength, char padChar) {
    if (str.length() > requiredLength) {
        return str;
    } else {
        return new String(new char[requiredLength - str.length()]).replace('\0', padChar) + str;
    }
}

このコードスニペットは歓迎されており、多少の助けになるかもしれませんが、質問への対処方法の説明含まれていれば大幅に改善されます。それがなければ、あなたの答えは教育的価値がはるかに低くなります-あなたが今尋ねている人だけでなく、将来的に読者のための質問に答えていることを忘れないでください!回答を編集して説明を追加し、適用される制限と前提を示してください。
Toby Speight 2017年

1

Javaの場合:

String zeroes="00000000";
String apple="apple";

String result=zeroes.substring(apple.length(),zeroes.length())+apple;

Scalaの場合:

"Apple".foldLeft("00000000"){(ac,e)=>ac.tail+e}

また、Java 8でストリームを使用して削減する方法を探ることもできます(私がScalaで行った方法と同様です)。他のすべてのソリューションとは少し異なり、特に気に入っています。


0

これは高速で、どんな長さでも機能します。

public static String prefixZeros(String value, int len) {
    char[] t = new char[len];
    int l = value.length();
    int k = len-l;
    for(int i=0;i<k;i++) { t[i]='0'; }
    value.getChars(0, l, t, k);
    return new String(t);
}

0

Stringのほとんどが正確に8文字である場合、Chris Lercherが答えるよりも速くなる可能性があります

int length = in.length();
return length == 8 ? in : ("00000000" + in).substring(length);

私の場合、私のマシンでは1/8速くなります。


0

これは、文字列の事前埋め込みに使用する、APIを使用しない単純な「読み取り可能なスクリプト」バージョンです。(シンプル、読みやすく、調整可能)。

while(str.length() < desired_length)
  str = '0'+str;

0

誰もがこの純粋なJavaソリューションを試しましたか(SpringUtilsなし):

//decimal to hex string 1=> 01, 10=>0A,..
String.format("%1$2s", Integer.toString(1,16) ).replace(" ","0");
//reply to original question, string with leading zeros. 
//first generates a 10 char long string with leading spaces, and then spaces are
//replaced by a zero string. 
String.format("%1$10s", "mystring" ).replace(" ","0");

残念ながら、このソリューションは、文字列に空白スペースがない場合にのみ機能します。


0

純粋なJavaでプログラムを記述したい場合は、以下の方法に従うか、より高度な機能をより効果的に使用できるようにする多くのString Utilsがあります。

単純な静的メソッドを使用すると、以下のようにこれを実現できます。

public static String addLeadingText(int length, String pad, String value) {
    String text = value;
    for (int x = 0; x < length - value.length(); x++) text = pad + text;
    return text;
}

上記の方法を使用できます addLeadingText(length, padding text, your text)

addLeadingText(8, "0", "Apple");

出力は000Appleになります


-3

きれいではありませんが、動作します。あなたがアクセスApacheコモンズを持っているなら私はそれを使うことを勧めます

if (val.length() < 8) {
  for (int i = 0; i < val - 8; i++) {
    val = "0" + val;
  }
}

2
-1はおそらくこれがあまり良い例ではないためです。「マジックナンバー」を使用して文字列を連結しているため、StringBuilderまたはStringBufferを使用して置き換える必要がある場合です。
Bart Kiers、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.