Comment formater une chaîne Java avec un zéro non significatif?

192

Voici la chaîne, par exemple:

"Apple"

et je voudrais ajouter zéro pour remplir 8 caractères:

"000Apple"

Comment puis-je le faire?

Roy
la source

Réponses:

287

Au cas où vous deviez le faire sans l'aide d'une bibliothèque:

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

(Fonctionne, tant que votre chaîne ne dépasse pas 8 caractères.)

Chris Lercher
la source
21
C'est assez intelligent - mais il m'a fallu environ 30 secondes pour «comprendre». Je pense qu'une solution plus lisible serait meilleure.
Amy B
2
C'est une excellente solution lorsque vous intégrez un logiciel sur quelque chose sans beaucoup d'espace et que les bibliothèques supplémentaires ne sont tout simplement pas une option. Merci!!
Casey Murray
Cette version est très rapide! J'aime cela.
Dakkaron
2
@Mathu honnêtement, ce n'est pas difficile à comprendre. Deux chaînes sont concaténées (jointes ensemble) et les 5 premiers caractères en sont extraits. Pas de magie. Pas très sensible dans ce cas (pour la chaîne fixe Apple) mais facile à comprendre. ("0000" + theString).substring(theString.length())est plus réaliste. Cette garniture theStringavec des zéros non significatifs. Désolé n'a pas pu résister à l'ajout de ce commentaire :)
HankCa
1
Cette solution a une syntaxe courte mais ce n'est pas "très rapide". Si vous avez de la chance, le compilateur l'optimisera, mais essentiellement la vraie façon "rapide" de le faire est d'utiliser a StringBuilder, et il faut une boucle pour le remplir. Si l'exigence est vraiment de ne tronquer que les chaînes de 8 caractères, c'est bien, bien que ce soit un cas d'utilisation très restreint, mais cette solution ne peut jamais être appelée rapidement. C'est juste court.
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);
    }
}
Alex Rashkov
la source
14
mais je voudrais ajouter un zéro avant une chaîne au lieu d'un int.
Roy
1
Vous pouvez utiliser StringUtils ou DecimalFormat pour Java 1.4 et versions antérieures. Vérifiez ici javadevnotes.com/java-integer-to-string-with-leading-zeros
JavaDev
3
@Variag utilise %07s au lieu de %07d, vous obtiendrez un fichier FormatFlagsConversionMismatchException. Tu peux l'essayer.
Z fp
127
 StringUtils.leftPad(yourString, 8, '0');

Cela vient de commons-lang . Voir javadoc

Bozho
la source
3
Pourquoi ne pas utiliser commons-lang? Il a un butin d'extras utiles.
Bozho
7
Même si vous ne pouvez pas utiliser commons-lang, vous pouvez facilement copier la source depuis StringUtils pour créer votre propre fonction. Ce serait une bien meilleure solution générale que la réponse choisie. docjar.com/html/api/org/apache/commons/lang/…
kaliatech
3
et si ce serait la seule méthode pour laquelle la bibliothèque est utilisée? Peut-être que la bibliothèque ajoutée est même plusieurs fois plus grande que l'application dans laquelle elle est utilisée. Je peux imaginer de nombreuses raisons de ne pas ajouter une bibliothèque commune dans une application. Ne vous méprenez pas: je suis d'accord, il contient des éléments très utiles, mais je comprends la réticence à remplir une application de fichiers JAR externes si l'avantage n'est pas d'écrire une seule (ou deux) méthodes.
Bart Kiers
2
Pour répondre à la question "Pourquoi ne pas utiliser commons-lang? Il a un butin d'extras utiles." question avec un exemple concret. Xiaomi propose une version obsolète de commons-lang sur ses appareils Android. L'inclusion d'une version plus récente dans votre application entraîne des conflits de chargeur de classe, de sorte que commons-lang ne peut plus être utilisé dans aucun projet Android.
Nachi
1
@Nachi même si StringUtils.leftPad obsolète devrait exister
Lluis Martinez
29

C'est ce qu'il demandait vraiment je crois:

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

production:

000Apple

la source
Ne fonctionne pas pour le cas général; si vous remplacez "Apple" par une chaîne de 8 caractères de longueur (ce qui est possible dans le cas d'OP), cela lance un DuplicateFormatFlagsException(à cause de la 00chaîne de formatage). Si vous remplacez une chaîne de plus de 8 caractères, cela lève un IllegalFormatFlagsException(à cause du nombre négatif).
nbrooks
Vous avez raison, mais qu'en est- ce alors: String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8); . Maintenant, vous n'aurez plus cette exception.
Abhinav Puri
Je veux juste ajouter String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8);c'est FAUX, ça devrait l'être String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(1,9); .
@ user4231709 Excellente solution! +1
user1697575
25

Vous pouvez utiliser la méthode String.format telle qu'utilisée dans une autre réponse pour générer une chaîne de 0,

String.format("%0"+length+"d",0)

Cela peut être appliqué à votre problème en ajustant dynamiquement le nombre de 0 non significatifs dans une chaîne de format:

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

C'est toujours une solution compliquée, mais a l'avantage que vous pouvez spécifier la longueur totale de la chaîne résultante en utilisant un argument entier.

ChadyWady
la source
17

Utilisation de la Stringsclasse utilitaire de Guava :

Strings.padStart("Apple", 8, '0');
Olivier Grégoire
la source
15

Vous pouvez utiliser ceci:

org.apache.commons.lang.StringUtils.leftPad("Apple", 8, "0")
Bébé Bency
la source
De loin la meilleure réponse. Apache commons StringUtils est une bibliothèque simple mais extrêmement utile.
Zoidberg
Cela a permis de gagner beaucoup de temps et c'est aussi propre et net.
Abhishek
9

J'ai été dans une situation similaire et j'ai utilisé ceci; C'est assez concis et vous n'avez pas à vous occuper de la longueur ou d'une autre bibliothèque.

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

Simple et soigné. Le format de chaîne renvoie " Apple"donc après avoir remplacé l'espace par des zéros, il donne le résultat souhaité.

Erdi İzgi
la source
Ensuite, vous souhaiterez peut-être d'abord fractionner la chaîne, appliquer l'opération ci-dessus à la première valeur de fractionnement, puis concaténer le reste des valeurs de fractionnement.
Erdi İzgi
6
String input = "Apple";
StringBuffer buf = new StringBuffer(input);

while (buf.length() < 8) {
  buf.insert(0, '0');
}

String output = buf.toString();
robert_x44
la source
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);
    }
}
Arne Deutsch
la source
1

Vous devrez peut-être prendre soin de l'Edgecase. C'est une méthode générique.

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;
    }
}
bragboy
la source
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);
}
Fathah Rehman P
la source
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;
    }
}
Nabil_H
la source
Bien que cet extrait de code soit le bienvenu et puisse fournir une aide, il serait grandement amélioré s'il incluait une explication de la façon dont il répond à la question. Sans cela, votre réponse a beaucoup moins de valeur éducative - rappelez-vous que vous répondez à la question pour les lecteurs à l'avenir, pas seulement pour la personne qui la pose maintenant! Veuillez modifier votre réponse pour ajouter une explication et donner une indication des limitations et hypothèses applicables.
Toby Speight
1

En Java:

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

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

Dans Scala:

"Apple".foldLeft("00000000"){(ac,e)=>ac.tail+e}

Vous pouvez également explorer un moyen dans Java 8 de le faire à l'aide de flux et de réduire (comme je l'ai fait avec Scala). C'est un peu différent de toutes les autres solutions et je l'aime particulièrement beaucoup.

Carlos
la source
0

C'est rapide et fonctionne pour n'importe quelle longueur.

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);
}
Deian
la source
0

Peut être plus rapide que la réponse de Chris Lercher lorsque la plupart des éléments de String ont exactement 8 caractères

int length = in.length();
return length == 8 ? in : ("00000000" + in).substring(length);

dans mon cas sur ma machine 1/8 plus rapide.

Kuguar6
la source
0

Voici la version simple de "script lisible" sans API que j'utilise pour le pré-remplissage d'une chaîne. (Simple, lisible et réglable).

while(str.length() < desired_length)
  str = '0'+str;
Tezra
la source
0

Quelqu'un a-t-il essayé cette solution Java pure (sans SpringUtils):

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

Malheureusement, cette solution ne fonctionne que si vous ne disposez pas d'espaces vides dans une chaîne.

Gico
la source
0

Si vous souhaitez écrire le programme en Java pur, vous pouvez suivre la méthode ci-dessous ou il existe de nombreux String Utils pour vous aider à mieux avec des fonctionnalités plus avancées.

En utilisant une méthode statique simple, vous pouvez y parvenir comme ci-dessous.

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

Vous pouvez utiliser la méthode ci-dessus addLeadingText(length, padding text, your text)

addLeadingText(8, "0", "Apple");

La sortie serait 000Apple

Googlian
la source
-3

Ce n'est pas joli, mais ça marche. Si vous avez accès à apache commons, je vous suggère de l'utiliser

if (val.length() < 8) {
  for (int i = 0; i < val - 8; i++) {
    val = "0" + val;
  }
}
mR_fr0g
la source
2
Le -1 est probablement dû au fait que ce n'est pas un très bon exemple: vous utilisez des "nombres magiques" et concaténez des chaînes, quelque chose qui devrait être remplacé en utilisant un StringBuilder ou un StringBuffer.
Bart Kiers