600 votes

Ajouter des zéros non significatifs à un nombre en Java ?

Existe-t-il un meilleur moyen d'obtenir ce résultat ? Cette fonction échoue si num a plus de chiffres que de chiffres, et j'ai l'impression qu'elle devrait être dans la bibliothèque quelque part (comme Integer.toString(x,"%3d") ou quelque chose comme ça)

static String intToString(int num, int digits) {
    StringBuffer s = new StringBuffer(digits);
    int zeroes = digits - (int) (Math.log(num) / Math.log(10)) - 1; 
    for (int i = 0; i < zeroes; i++) {
        s.append(0);
    }
    return s.append(num).toString();
}

1 votes

Vous devriez changer la réponse acceptée pour celle de @begray. La sienne est bien meilleure pour la grande majorité des applications et pour une quantité de zéros modifiable, vous pouvez utiliser String.format("%0" + digits + "d", num);

2 votes

Bien sûr. À l'époque, j'ai accepté celle d'Elijah parce que mon projet était bloqué sur Java 1.4, mais je ne pense pas que cela vaille la peine de détourner 100 000 autres utilisateurs de ce qui s'est avéré fonctionner pour moi.

0 votes

J'ai voté pour fermer cette question en tant que duplicata. Bien que cette question ait été posée en premier, je pense que le doublon est légèrement plus clair à lire et semble être la question canonique (d'après les votes positifs et le nombre de vues).

1542voto

begray Points 4636

String.format ( https://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html#syntax )

Dans votre cas, ce sera :

String formatted = String.format("%03d", num);
  • 0 - remplissage avec des zéros
  • 3 - pour fixer la largeur à 3

0 votes

Si le nombre de chiffres est variable (par exemple, s'il est fourni comme argument), la méthode ci-dessus, bien qu'élégante, peut ne pas convenir.

67 votes

Santhosh... Il suffit de créer dynamiquement la chaîne de format String.format("%0" + paddingSize + "d", num)

0 votes

@Fran sauf ceux de GWT, je suppose

94voto

Jason Coco Points 52303

Depuis Java 1.5, vous pouvez utiliser l'option String.format méthode. Par exemple, pour faire la même chose que votre exemple :

String format = String.format("%0%d", digits);
String result = String.format(format, num);
return result;

Dans ce cas, vous créez la chaîne de format en utilisant la largeur spécifiée dans les chiffres, puis vous l'appliquez directement au nombre. Le format de cet exemple est converti comme suit :

%% --> %
0  --> 0
%d --> <value of digits>
d  --> d

Ainsi, si digits est égal à 5, la chaîne de format devient %05d qui spécifie un nombre entier avec une largeur de 5 imprimant des zéros de tête. Voir le docs java para String.format pour plus d'informations sur les spécificateurs de conversion.

0 votes

Voir la réponse de begray qui utilise les drapeaux corrects pour mettre à zéro une sortie de 3 caractères.

3 votes

@Robert Il définit effectivement la largeur correcte. C'est exactement la même chose que la réponse de bergay, sauf que le remplissage est ajouté par programme en utilisant la même interface. Avez-vous simplement jeté un coup d'œil à la chaîne de format et décidé qu'elle était incorrecte sans regarder ce que le code faisait réellement ?

2 votes

Il semble inutile d'utiliser String.format() deux fois, utilisez simplement la concaténation de chaînes de caractères : String.format("%0" + digits + "d", num)

39voto

Elijah Points 6464

Une autre option consiste à utiliser Format décimal pour formater votre chaîne numérique. Voici une autre façon de faire le travail sans avoir à utiliser String.format si vous êtes coincé dans le monde pré 1.5 :

static String intToString(int num, int digits) {
    assert digits > 0 : "Invalid number of digits";

    // create variable length array of zeros
    char[] zeros = new char[digits];
    Arrays.fill(zeros, '0');
    // format number as String
    DecimalFormat df = new DecimalFormat(String.valueOf(zeros));

    return df.format(num);
}

1 votes

Ne fonctionne pas lorsque num = 0, il manque un zéro.

8voto

Torin Rudeen Points 49

Pourquoi pas juste :

public static String intToString(int num, int digits) {
    String output = Integer.toString(num);
    while (output.length() < digits) output = "0" + output;
    return output;
}

3 votes

(1) Cela va retourner 0num0num0num etc, au lieu de 00000num (2) Beaucoup de concaténations de chaînes avec "+" sont une mauvaise idée en termes de performance. Il vaut mieux préallouer un StringBuffer ou StringBuilder de longueur 'digits'.

8 votes

"(1) Cela va retourner 0num0num0num etc, au lieu de 00000num" - Vous avez tort avec ce commentaire... num n'est pas dans la boucle.

0 votes

@Nappy vous avez raison, je ne sais pas pourquoi je ne l'ai pas vu à l'époque.

-13voto

Dans le cas d'une version de votre jdk inférieure à 1.5, l'option suivante peut être utilisée.

    int iTest = 2;
    StringBuffer sTest = new StringBuffer("000000"); //if the string size is 6
    sTest.append(String.valueOf(iTest));
    System.out.println(sTest.substring(sTest.length()-6, sTest.length()));

7 votes

-1 : Cette solution est inutilement compliquée et non extensible.

1 votes

Cela complique et rend les valeurs redondantes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X