선행 0으로 Java 문자열을 형식화하는 방법은 무엇입니까?


192

예를 들어 문자열은 다음과 같습니다.

"Apple"

8 문자를 채우기 위해 0을 추가하고 싶습니다.

"000Apple"

어떻게해야합니까?

답변:


287

도서관의 도움없이해야 할 경우 :

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

(문자열이 8자를 넘지 않는 한 작동합니다.)


21
꽤 영리합니다.하지만 "얻기"까지 약 30 초가 걸렸습니다. 더 읽기 쉬운 솔루션이 더 좋을 것이라고 생각합니다.
— Amy B

2
공간이 부족한 곳에 소프트웨어를 임베드 할 때이 솔루션은 탁월한 솔루션이며 추가 라이브러리는 옵션이 아닙니다. 감사!!
— 케이시 머레이

이 버전은 정말 빠릅니다! 나는 그것을 좋아한다.
— Dakkaron

2
@Mathu 정직하게 이해하기 어렵지 않습니다. 두 개의 문자열이 연결되고 (함께 결합 됨) 처음 5자가 추출됩니다. 마법이 없습니다. 이 경우 고정 문자열 Apple의 경우에는 합리적이지 않지만 이해하기 쉽습니다. ("0000" + theString).substring(theString.length())더 현실적입니다. 이것은 theString선행 0으로 채워집니다. 죄송합니다이 코멘트를 추가 저항 할 수 없습니다 :)
— HankCa

1
이 솔루션에는 짧은 구문이 있지만 "미친 빠른"것은 아닙니다. 운이 좋으면 컴파일러가 최적화하지만 본질적으로 이것을 수행하는 실제 "빠른"방법은을 사용하는 것이며 StringBuilder, 그것을 채우기 위해 루프가 필요합니다. 요구 사항이 실제로 8 자 문자열 만 잘라야하는 경우 매우 좁은 사용 사례이지만이 솔루션을 결코 빠르게 호출 할 수는 없습니다. 짧습니다.
— Dici

321
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 대신 문자열 앞에 선행 0을 추가하고 싶습니다.
— Roy

1
Java 1.4 이하에서는 StringUtils 또는 DecimalFormat을 사용할 수 있습니다. 여기에서 확인하십시오 javadevnotes.com/java-integer-to-string-with-leading-zeros
— JavaDev

3
사용 @Variag %07s 대신 %07d, 당신은 얻을 것이다 FormatFlagsConversionMismatchException. 당신은 그것을 시도 할 수 있습니다.
— 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
그것이 라이브러리가 사용되는 유일한 방법이라면 어떨까요? 아마도 추가 된 라이브러리는 사용되는 앱보다 몇 배 더 큽니다. 응용 프로그램에 commons 라이브러리를 추가 하지 않는 이유는 꽤 있습니다 . 나에게 잘못하지 마십시오 : 나는 매우 유용한 것들을 포함하고 있지만, 이점이 하나 또는 두 개의 메소드를 작성할 필요가 없다면 외부 JAR로 가득 찬 앱을 채우는 것을 꺼려한다는 것을 이해합니다.
— Bart Kiers

2
(가) 대답하기 위해 "왜 평민 - 랭를 사용하지? 유용 여분의 전리품이 있습니다." 구체적인 예를 들어 질문하십시오. Xiaomi는 Android 장치에 오래된 버전의 commons-lang을 제공합니다. 앱에 최신 버전을 포함하면 클래스 로더 충돌이 발생하므로 모든 Android 프로젝트에서 commons-lang을 더 이상 사용할 수 없습니다.
— Nachi

1
구식 StringUtils.leftPad가 존재하더라도 @Nachi
— Lluis Martinez

29

이것이 그가 정말로 요구 한 것입니다.

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

산출:

000Apple

일반적인 경우에는 작동하지 않습니다. "Apple"을 길이가 8자인 문자열 (OP의 경우 가능)로 바꾸면 DuplicateFormatFlagsException( 00형식 문자열의 때문에 ) 8자를 초과하는 문자열을 대체하면 IllegalFormatFlagsException(음수 때문에)를 던집니다 .
— nbrooks

당신 말이 맞지만, 이것에 대해서는 어떻습니까 : String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8); . 이제이 예외는 없습니다.
— Abhinav Puri

추가하고 싶을 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
— 1697575

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는 간단하지만 매우 유용한 라이브러리입니다.
— Zoidberg

이것은 많은 시간을 절약했으며 깔끔하고 깨끗합니다.
— Abhishek

9

나는 비슷한 상황에 있었고 이것을 사용했습니다. 그것은 간결하고 길이나 다른 라이브러리를 다룰 필요가 없습니다.

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

간단하고 깔끔합니다. " Apple"공백을 0으로 바꾸면 문자열 형식이 반환 되므로 원하는 결과가 나타납니다.


그런 다음 문자열을 먼저 분할하고 나머지 분할 값을 연결하는 것보다 위의 작업을 첫 번째 분할 값에 적용 할 수 있습니다.
— Erdi İzgi

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

1

자바에서 :

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

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

스칼라에서 :

"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

대부분의 문자열에서 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

누구든지 SpringUtils 없이이 순수한 Java 솔루션을 사용해 보셨습니까?

//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

예쁘지는 않지만 작동합니다. 아파치 커먼즈에 액세스 할 수 있다면 사용하는 것이 좋습니다.

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.