Come posso riempire un numero intero con zeri a sinistra?
-
19-08-2019 - |
Domanda
Come hai lasciato pad un int
con zeri durante la conversione in String
in java?
Fondamentalmente sto cercando di riempire gli interi fino a 9999
con zeri iniziali (ad es. 1 = 0001
).
Soluzione
Usa java.lang.String.format (String, Object ...)
in questo modo:
String.format("%05d", yournumber);
per zero-padding con una lunghezza di 5. Per output esadecimale sostituire d
con un x
come in "% 05x "
.
Le opzioni di formattazione complete sono documentate come parte di < code> java.util.Formatter .
Altri suggerimenti
Se per qualsiasi motivo usi pre 1.5 Java allora puoi provare con il metodo Apache Commons Lang
org.apache.commons.lang.StringUtils.leftPad(String str, int size, '0')
Supponiamo che tu voglia stampare 11
come 011
Puoi utilizzare un formattatore : "% 03d "
.
Puoi usare questo formattatore in questo modo:
int a = 11;
String with3digits = String.format("%03d", a);
System.out.println(with3digits);
In alternativa, alcuni metodi java supportano direttamente questi formattatori:
System.out.printf("%03d", a);
Trovato questo esempio ... Testerà ...
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));
}
}
Testato questo e:
String.format("%05d",number);
Entrambi funzionano, per i miei scopi penso che String.Format sia migliore e più conciso.
Se le prestazioni sono importanti nel tuo caso, potresti farlo da solo con un sovraccarico minore rispetto alla funzione 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();
}
Performance
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");
}
Risultato
Funzione propria: 1697ms
String.format: 38134ms
Puoi utilizzare Google Guava :
Maven:
<dependency>
<artifactId>guava</artifactId>
<groupId>com.google.guava</groupId>
<version>14.0.1</version>
</dependency>
Codice di esempio:
String paddedString1 = Strings.padStart("7", 3, '0'); //"007"
String paddedString2 = Strings.padStart("2020", 3, '0'); //"2020"
Nota:
Guava
è una libreria molto utile, offre anche molte funzionalità relative a Collezioni
, Caches
, Idiomi funzionali
, Concurrency
, Strings
, Primitives
, Ranges
, IO
, Hashing
, EventBus
, ecc.
Rif: GuavaExplained
Prova questo:
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
Sebbene molti degli approcci di cui sopra siano buoni, ma a volte abbiamo bisogno di formattare numeri interi e float. Possiamo usarlo, in particolare quando abbiamo bisogno di riempire un determinato numero di zeri sia a sinistra che a destra dei numeri decimali.
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(",",""));
}
}
int x = 1;
System.out.format("%05d",x);
se si desidera stampare il testo formattato direttamente sullo schermo.
Usa la classe DecimalFormat, in questo modo:
NumberFormat formatter = new DecimalFormat("0000"); //i use 4 Zero but you can also another number
System.out.println("OUTPUT : "+formatter.format(811));
USCITA: 0000811
Controlla il mio codice che funzionerà con numeri interi e String.
Supponiamo che il nostro primo numero sia 2. E vogliamo aggiungere degli zeri a quello, quindi la lunghezza della stringa finale sarà 4. Per questo puoi usare il seguente codice
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);
Devi usare un Formatter, il codice seguente usa NumberFormat
int inputNo = 1;
NumberFormat nf = NumberFormat.getInstance();
nf.setMaximumIntegerDigits(4);
nf.setMinimumIntegerDigits(4);
nf.setGroupingUsed(false);
System.out.println("Formatted Integer : " + nf.format(inputNo));
Output: 0001
public static String zeroPad(long number, int width) {
long wrapAt = (long)Math.pow(10, width);
return String.valueOf(number % wrapAt + wrapAt).substring(1);
}
L'unico problema con questo approccio è che ti fa indossare il cappello pensante per capire come funziona.
Nessun pacchetto necessario:
String paddedString = i < 100 ? i < 10 ? "00" + i : "0" + i : "" + i;
Questo riempirà la stringa di tre caratteri ed è facile aggiungere una parte in più per quattro o cinque. So che questa non è la soluzione perfetta in alcun modo (soprattutto se vuoi una grande stringa imbottita), ma mi piace.