回答:
ライブラリの助けを借りずにそれをしなければならない場合:
("00000000" + "Apple").substring("Apple".length())
(文字列が8文字を超えない限り機能します。)
("0000" + theString).substring(theString.length())
より現実的です。これtheString
は先行ゼロで埋めます。申し訳ありませんが、このコメントの追加に抵抗できませんでした:)
StringBuilder
ことであり、ループを埋める必要があります。要件が実際には8文字の文字列のみを切り捨てることで問題ない場合、それは非常に狭いユースケースですが、このソリューションを高速に呼び出すことはできません。短いです。
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);
}
}
%07s
代わりに使用すると%07d
、FormatFlagsConversionMismatchException
。あなたはそれを試すことができます。
StringUtils.leftPad(yourString, 8, '0');
これは彼が私が信じていることを本当に求めていたものです:
String.format("%0"+ (8 - "Apple".length() )+"d%s",0 ,"Apple");
出力:
000Apple
DuplicateFormatFlagsException
(00
フォーマット文字列内にあるため)をスローします。8文字より長い文字列を置き換えると、IllegalFormatFlagsException
(負の数のため)がスローされます。
String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8);
。これで、この例外はなくなります。
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);
。
別の回答で使用されている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);
}
それはまだ厄介なソリューションですが、整数の引数を使用して結果の文字列の全長を指定できるという利点があります。
GuavaのStrings
ユーティリティクラスを使用する:
Strings.padStart("Apple", 8, '0');
あなたはこれを使うことができます:
org.apache.commons.lang.StringUtils.leftPad("Apple", 8, "0")
私も同じような状況にあり、これを使用しました。それは非常に簡潔であり、長さや他のライブラリを扱う必要はありません。
String str = String.format("%8s","Apple");
str = str.replace(' ','0');
シンプルで端正です。文字列形式が返される" Apple"
ため、スペースをゼロに置き換えた後、目的の結果が得られます。
String input = "Apple";
StringBuffer buf = new StringBuffer(input);
while (buf.length() < 8) {
buf.insert(0, '0');
}
String output = buf.toString();
Apache Commons StringUtils.leftPadを使用します(または独自の関数を作成するためのコードを確認します)。
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);
}
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;
}
}
Stringのほとんどが正確に8文字である場合、Chris Lercherが答えるよりも速くなる可能性があります
int length = in.length();
return length == 8 ? in : ("00000000" + in).substring(length);
私の場合、私のマシンでは1/8速くなります。
誰もがこの純粋な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");
残念ながら、このソリューションは、文字列に空白スペースがない場合にのみ機能します。
純粋な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になります
きれいではありませんが、動作します。あなたがアクセスApacheコモンズを持っているなら私はそれを使うことを勧めます
if (val.length() < 8) {
for (int i = 0; i < val - 8; i++) {
val = "0" + val;
}
}