선행 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.