왼쪽에 0으로 정수를 채우려면 어떻게해야합니까?


1022

Java int로 변환 할 때 어떻게 0 String으로 채 웠습니까?

기본적으로 정수를 9999앞에 오는 0으로 채우려 고합니다 (예 : 1 = 0001).


2
그래, 그거야! 내 나쁜 ... 난 내 휴대 전화에 입력했습니다. "새 문자열"이 필요하지 않습니다. Integer.toString (num + 10000) .subString (1) 작동합니다.
Randyaa

Long.valueOf ( "00003400"). toString (); Integer.valueOf ( "00003400"). toString (); ---> 3400
frekele

1
다이어그램이있는 솔루션에 대해서는 stackoverflow.com/questions/35521278/… 도 참조하십시오.
bvdb

그래도 9999보다 큰 new String(Integer.toString(num + 10000)).substring(1)경우 접근 방식에 문제가 있습니다 num.
Felype

답변:


1695

다음 java.lang.String.format(String,Object...)과 같이 사용하십시오 .

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

길이가 5 인 제로 패딩의 경우 16 진 출력의 d경우 xas를로 변경하십시오 "%05x".

전체 서식 옵션은의 일부로 설명되어 있습니다 java.util.Formatter.


1
String.formatC에서 printf ()와 비슷한 옵션을 기대해야합니까 ?
Ehtesh Choudhury

13
큰 값 목록에 대해이 작업을 수행해야하는 경우 DecimalFormat의 성능이 String.format ()보다 3 배 이상 우수합니다. 성능 조정을 직접 수행하고 Visual VM에서 두 가지를 실행하면 DecimalFormat.format () 속도의 약 3-4 배에 CPU 시간을 축적하는 String.format () 메서드가 표시됩니다.
Steve Ferguson 17

10
그리고 9 개 이상의 0을 추가하려면 다음과 같은 것을 사용하십시오%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
Helio Soares Junior 18

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

좋은 대답입니다! 단지 주석 F인 format ()은 다음 f과 같아야합니다 String.format(...);.
David Miguel

선행 0을 제외한 다른 문자 / 번호를 추가하지 않으려면 어떻게해야합니까? 고마워
chiperortiz

1
@chiperortiz afaik 위의 포맷 도구로는 불가능합니다. 이 경우 필요한 선행 문자 (예 :)를 계산 int prefixLength = requiredTotalLength - String.valueOf(numericValue).length한 다음 반복 문자열 방법을 사용하여 필요한 접두사를 만듭니다. 문자열을 반복하는 여러 가지 방법이 있지만 네이티브 Java는 없습니다 : 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은 새 형식이어야합니다.
Paul Tomblin

.Net에서하는 방법과 비슷합니다. .Net 방법이 작은 숫자에 대해 더 좋아 보인다는 것을 제외하고.
Omar Kooheji

제 경우에는 첫 번째 옵션 (DecimalFormat)을 사용했습니다. 왜냐하면 내 번호는 Double
mauronet이므로 21:06에

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

문자열 형식 : 38134ms


1
위에서 DecimalFormat을 사용하는 것이 더 빠르다는 언급이 있습니다. 그것에 대한 메모가 있습니까?
Patrick

@Patrick DecimalFormat 성능은 다음을 참조하십시오 : stackoverflow.com/questions/8553672/…
Stephan

충격적인! 기능이 너무 나쁘게 작동하는 것은 견과류입니다. 나는 패드를 제로로 고정하고 1 ~ 3 자리 범위의 부호없는 정수 모음을 표시해야했습니다. 번개처럼 빨리 작동해야했습니다. 나는이 간단한 방법을 사용 for( int i : data ) strData += (i > 9 ? (i > 99 ? "" : "0") : "00") + Integer.toString( i ) + "|";했습니다 : 그것은 매우 빠르게 작동했습니다 (죄송합니다).
BuvinJ

HotSpot에 균열이 발생하기에 충분한 성능을 발휘 한 후 성능을 어떻게 비교합니까?
Phil

16

Google Guava 를 사용할 수 있습니다 .

메이븐 :

<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매우 유용한 라이브러리, 그것은 또한 관련 기능을 많이 제공 Collections, Caches, Functional idioms, Concurrency, Strings, Primitives, Ranges, IO, Hashing, EventBus, 등

참조 : 구아바


1
위의 샘플 코드는 실제로 사용되는 것이 아니라 샘플 코드입니다. 코멘트는 이것을 반영, 당신은 "문자열 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 진수의 오른쪽뿐만 아니라 왼쪽에 특정 숫자의 0을 채울 필요가있을 때 이것을 사용할 수 있습니다.

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

... 및 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가되도록 0을 추가하려고합니다. 다음 코드를 사용할 수 있습니다

    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])이유
아이작

replace("\0", "0")무엇은 ... 무엇
아이작

@Isaac-먼저 char 배열을 만들고 해당 char 배열을 사용하여 문자열을 만들었습니다. 그런 다음 null 문자 (char 유형의 기본값)를 "0"(패딩에 필요한 문자)으로
바꿨습니다.

0

다음 코드에서 NumberFormat 을 사용하는 Formatter를 사용해야합니다.

    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.