Solda sıfırlarla bir tamsayıyı nasıl doldurabilirim?


1022

Java ile intdönüştürürken nasıl bir p sıfır ile bıraktı String?

Temelde 9999önde gelen sıfırlar (örneğin 1 = 0001) ile tamsayı pad için arıyorum .


2
Evet, hepsi bu! benim hatam ... Telefonuma yazdım. "Yeni dize" gerek yok: Integer.toString (num + 10000) .subString (1) çalışır.
Randyaa

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

1
ayrıca şemaya sahip bir çözüm için stackoverflow.com/questions/35521278/…
bvdb

Yine de 9999'dan daha büyük bir new String(Integer.toString(num + 10000)).substring(1)yaklaşım varsa , bir sorun var num, ijs.
Felype

Yanıtlar:


1696

Bunun java.lang.String.format(String,Object...)gibi kullanın :

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

onaltılık çıkışı için 5 bir uzunluğa sahip sıfır doldurma için yerine dbir ile xolduğu gibi "%05x".

Tam biçimlendirme seçenekleri bir parçası olarak belgelenmiştir java.util.Formatter.


1
String.formatC'deki printf () seçeneklerinin benzer olmasını beklemeli miyim ?
Ehtesh Choudhury

13
Bunu büyük bir değer listesi için yapmanız gerekiyorsa, DecimalFormat'ın performansı String.format () öğesinden en az 3 kat daha iyidir. Kendimi ayarlama ve Visual VM'de iki çalışan bazı performans süreci devam ediyorum DecimalFormat.format () oranının yaklaşık 3-4 kat CPU zamanı biriktiren String.format () yöntemini gösterir.
Steve Ferguson

10
Ve 9'dan fazla sıfır eklemek için böyle bir şey kullanın%012d
Mohammad Banisaeid

2
Bu Java 5 ve üstü içindir. 1.4 ve daha düşük DecimalFormat için
JavaDev

1
Merhaba millet! Kullanırken bazı sorunlar yaşıyorum:%d can't format java.lang.String arguments
Helio Soares Junior

116

Let en yazdırmak istediğiniz demek 11olarak011

Bir biçimlendirici kullanabilirsiniz : "%03d".

resim açıklamasını buraya girin

Bu biçimlendiriciyi şu şekilde kullanabilirsiniz:

int a = 11;
String with3digits = String.format("%03d", a);
System.out.println(with3digits);

Alternatif olarak, bazı java yöntemleri bu biçimlendiricileri doğrudan destekler:

System.out.printf("%03d", a);

5
@Omar Koohei gerçekten, ama bu "sihirli sabitler" arkasındaki mantığı açıklıyor.
bvdb

Güzel cevap! Sadece bir yorum, Fformat () olmalıdır f: String.format(...);.
David Miguel

Baştaki 0 ​​yerine başka bir harf / sayı eklemek istemezsem ne olur? teşekkürler
chiperortiz

1
@chiperortiz afaik yukarıdaki biçimlendirme araçlarıyla mümkün değildir. Bu durumda, gerekli baştaki karakterleri (örneğin int prefixLength = requiredTotalLength - String.valueOf(numericValue).length) hesaplar ve sonra gerekli öneki oluşturmak için bir yineleme dizesi yöntemi kullanırım. Dizeleri tekrarlamanın çeşitli yolları vardır, ancak yerel bir java olanı yoktur, afaik: stackoverflow.com/questions/1235179/…
bvdb

114

Herhangi bir nedenle 1.5 öncesi Java kullanıyorsanız Apache Commons Lang yöntemi ile deneyebilirsiniz

org.apache.commons.lang.StringUtils.leftPad(String str, int size, '0')

29

Bu örneği buldum ... Test edecek ...

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));
    }
}

Bunu test etti ve:

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

Her ikisi de çalışır, benim için String.Format daha iyi ve daha özlü olduğunu düşünüyorum.


1
Evet, DecimalFormat'ı önerecektim çünkü String.format'ı bilmiyordum, ama sonra uzhin'in cevabını gördüm. String.format yeni olmalıdır.
Paul Tomblin

.Net yolu dışında küçük sayılar için daha hoş görünüyor. Net hariç.
Omar Kooheji

Benim durumumda ilk seçeneği (DecimalFormat) kullandım çünkü numaram çift
mauronet

21

Durumunuzda performans önemliyse, String.formatişleve kıyasla daha az ek yük ile kendiniz yapabilirsiniz :

/**
 * @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();       
}

Verim

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");
}

Sonuç

Kendi işlevi: 1697 ms

String.format: 38134ms


1
Yukarıda DecimalFormat'ı daha hızlı kullanmanın bir sözü var. Bununla ilgili notların var mı?
Patrick

@Patrick DecimalFormat performansı için ayrıca bakınız: stackoverflow.com/questions/8553672/…
Stephan

Şok edici! Bu işlev çok kötü çalışan fındık. Ben sıfır pad ve 1 ila 3 basamak arasında değişebilir imzasız ints bir koleksiyon görüntülemek zorunda kaldı. Yıldırım hızlı çalışması gerekiyordu. Bu basit yöntemi kullandım: for( int i : data ) strData += (i > 9 ? (i > 99 ? "" : "0") : "00") + Integer.toString( i ) + "|";Bu çok hızlı çalıştı (üzgünüm zamanlamadım!).
BuvinJ

HotSpot'un bir çatlamaya sahip olması için çalıştırıldıktan sonra performans nasıl karşılaştırılır?
Phil

16

Google Guava'yı kullanabilirsiniz :

Uzman:

<dependency>
     <artifactId>guava</artifactId>
     <groupId>com.google.guava</groupId>
     <version>14.0.1</version>
</dependency>

Basit kod:

String paddedString1 = Strings.padStart("7", 3, '0'); //"007"
String paddedString2 = Strings.padStart("2020", 3, '0'); //"2020"

Not:

Guavaçok yararlı bir kütüphane, aynı zamanda ilgili birçok özellik içerir Collections, Caches, Functional idioms, Concurrency, Strings, Primitives, Ranges, IO, Hashing, EventBus, vb

Ref: GuavaAçıklandı


1
Yukarıdaki örnek kod sadece örnek kod değil, sadece kullanım içindir. Yorum bunu yansıtır, "String myPaddedString = Strings.padStart (...)"
JoeG

2
Bu yöntem aslında JDK String.format / MessageFormatter / DecimalFormatter'dan çok daha iyi performans sonuçları verir.
rafalmag

10

Bunu dene:

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

Yukarıdaki yaklaşımların birçoğu iyi olmasına rağmen, bazen tamsayıların yanı sıra kayan sayıları da biçimlendirmemiz gerekir. Bunu, özellikle de ondalık sayıların soluna ve sağına belirli sayıda sıfır doldurmamız gerektiğinde kullanabiliriz.

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);

biçimlendirilmiş metni doğrudan ekrana yazdırmak istiyorsanız.


1
Ama OP bunu hiç istemedi. Dahili olarak String.formatve System.out.formataynı java.util.Formatteruygulamayı çağırın .
bsd

... ve System.out yönlendirilebilir.
Phil

1

DecimalFormat sınıfını şu şekilde kullanın:

NumberFormat formatter = new DecimalFormat("0000"); //i use 4 Zero but you can also another number
System.out.println("OUTPUT : "+formatter.format(811)); 

ÇIKTI: 0000811


1

Dizenizi kullanmadan nasıl biçimlendirebileceğiniz aşağıda açıklanmıştır DecimalFormat.

String.format("%02d", 9)

09

String.format("%03d", 19)

019

String.format("%04d", 119)

0119


0

Tamsayı ve Dize için çalışacak kodumu kontrol edin.

İlk sayımızın 2 olduğunu varsayalım ve buna son dizenin uzunluğu 4 olacak şekilde sıfırlar eklemek istiyoruz. Bunun için aşağıdaki kodu kullanabilirsiniz

    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])neden
Isaac

replace("\0", "0")ne ... ne
Isaac

@Isaac - Önce bir char dizisi oluşturdum ve bu char dizisini kullanarak bir dize oluşturdum. Sonra null karakterini (karakter türünün varsayılan değeri olan) "0" (dolgu için ihtiyacımız olan karakter) ile değiştirdim
Fathah Rehman P

0

Bir Formatter kullanmanız gerekir, aşağıdaki kod NumberFormat kullanır

    int inputNo = 1;
    NumberFormat nf = NumberFormat.getInstance();
    nf.setMaximumIntegerDigits(4);
    nf.setMinimumIntegerDigits(4);
    nf.setGroupingUsed(false);

    System.out.println("Formatted Integer : " + nf.format(inputNo));

Çıktı: 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);
}

Bu yaklaşımdaki tek sorun, nasıl çalıştığını anlamanız için düşünme şapkanızı giymenizdir.


5
Tek sorun? Negatif numberveya width18'den büyük bir
değerle deneyin

2
İyi bir nokta. Ve genişlik (ki açıkça istendi değil ama tipik olarak gerekli) kesilir beri istenen daha fazla sanırım. Java'nın (karşılaştırıldığında ağrılı yavaş) String.format () değişken genişlikleri desteklememesi ve tamsayı belirteçleri için hassasiyeti desteklememesi utanç vericidir.
johncurrier

-3

Paket gerekmez:

String paddedString = i < 100 ? i < 10 ? "00" + i : "0" + i : "" + i;

Bu, dizeyi üç karaktere doldurur ve dört veya beş için daha fazla parça eklemek kolaydır. Bu herhangi bir şekilde (özellikle büyük bir yastıklı dize istiyorsanız) mükemmel bir çözüm olmadığını biliyorum, ama bunu seviyorum.


1
Hmm ... Hoşuma gitti.
Kartik Chugh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.