web-dev-qa-db-fra.com

que signifient ces chaînes symboliques:% 02d% 01d?

Je regarde une ligne de code semblable à:

sprintf(buffer,"%02d:%02d:%02d",hour,minute,second);

Je pense que les chaînes symboliques font référence au nombre de caractères numériques affichés par heure, minute, etc. - ou quelque chose comme ça, je ne suis pas tout à fait certain. 

Normalement, je peux comprendre ce genre de chose, mais je suis incapable de trouver une référence utile en cherchant "% 02d% 01d" sur Google. Quelqu'un peut-il m'éclairer?

20
dRef90

http://www.cplusplus.com/reference/clibrary/cstdio/printf/

les mêmes règles devraient s'appliquer à Java.

dans votre cas, cela signifie la sortie de valeurs entières de 2 chiffres ou plus, le premier étant zéro si le nombre est inférieur ou égal à 9

19
AlexanderMP

Au lieu de googler pour %02d, vous auriez dû chercher la fonction sprintf().

%02d signifie "formater le nombre entier avec 2 chiffres, en le remplissant à gauche avec des zéros", ainsi:

 Format Données Résultat 
% 02d 1 01 
% 02d 11 11 
43
Anax

Ils mettent en forme String. La syntaxe spécifique à Java est donnée dans Java.util.Formatter .

La syntaxe générale est la suivante:

   %[argument_index$][flags][width][.precision]conversion

%02d effectue une conversion entière décimale d, formatée avec un remplissage nul (drapeau 0), avec une largeur 2. Ainsi, un argument int dont la valeur est say 7 sera formaté en "07" en tant que String.

Vous pouvez également voir cette chaîne de formatage dans, par exemple, String.format .


Formats couramment utilisés

Ce ne sont que quelques formats couramment utilisés et ne couvrent pas la syntaxe de manière exhaustive.

Zéro remplissage pour les nombres

System.out.printf("Agent %03d to the rescue!", 7);
// Agent 007 to the rescue!

Largeur pour justification

Vous pouvez utiliser le drapeau - pour une justification à gauche; sinon ce sera une bonne justification.

for (Map.Entry<Object,Object> prop : System.getProperties().entrySet()) {
    System.out.printf("%-30s : %50s%n", prop.getKey(), prop.getValue());
}

Cela affiche quelque chose comme:

Java.version                   :                                 1.6.0_07
Java.vm.name                   :               Java HotSpot(TM) Client VM
Java.vm.vendor                 :                    Sun Microsystems Inc.
Java.vm.specification.name     :       Java Virtual Machine Specification
Java.runtime.name              :          Java(TM) SE Runtime Environment
Java.vendor.url                :                     http://Java.Sun.com/

Pour un formatage de message plus puissant, vous pouvez utiliser Java.text.MessageFormat . %n est la conversion de nouvelle ligne (voir ci-dessous).

Conversion hexadécimale

System.out.println(Integer.toHexString(255));
// ff

System.out.printf("%d is %<08X", 255);
// 255 is 000000FF

Notez que cela utilise également l'indexation relative < (voir ci-dessous).

Mise en forme en virgule flottante

System.out.printf("%+,010.2f%n", 1234.567);
System.out.printf("%+,010.2f%n", -66.6666);
// +01,234.57
// -000066.67

Pour un formatage plus puissant, utilisez DecimalFormat à la place.

%n pour le séparateur de ligne spécifique à la plate-forme

System.out.printf("%s,%n%s%n", "Hello", "World");
// Hello,
// World

%% pour un signe %- réel

System.out.printf("It's %s%% guaranteed!", 99.99);
// It's 99.99% guaranteed!

Notez que le double littéral 99.99 est automatiquement associé à Double, sur lequel une conversion de chaîne utilisant toString() est définie.

n$ pour l'indexation d'arguments explicites

System.out.printf("%1$s! %1$s %2$s! %1$s %2$s %3$s!",
    "Du", "hast", "mich"
);
// Du! Du hast! Du hast mich!

< pour l'indexation relative

System.out.format("%s?! %<S?!?!?", "Who's your daddy");
// Who's your daddy?! WHO'S YOUR DADDY?!?!?

Questions connexes

23
polygenelubricants

La réponse d'Alexandre fait référence à des documents complets ...

Votre exemple simple tiré de la question imprime simplement ces valeurs avec 2 chiffres - en ajoutant le 0 devant le cas échéant.

0
Daniel Bleisteiner

http://en.wikipedia.org/wiki/Printf#printf_format_placeholders

L'article traite de la class des fonctions printf, en plusieurs langues, des années 50 à nos jours.

0
Marco Mariani

% est un caractère spécial que vous mettez dans des chaînes de format, par exemple, dans les langages C printf et scanf (et famille), qui indique en gros "ceci est un espace réservé pour autre chose, qui ne doit pas être imprimé/lu à la lettre. " 

Par exemple, un (%02d) dans une chaîne de format pour printf est un espace réservé pour une variable entière qui sera imprimée en décimal (%02d) et complétée à au moins deux chiffres, avec des zéros si nécessaire. 

Le nombre entier réel est fourni par vous dans un argument de la fonction, par ex. printf("%02d",5); afficherait 05 à l'écran, (%01d) fonctionnera également de la même manière 

Même chose pour Java et d'autres langues aussi :)

0
Rajnish