web-dev-qa-db-fra.com

printf avec des zéros non significatifs en C

J'ai un nombre à virgule flottante tel que 4917.24. Je voudrais l'imprimer pour avoir toujours cinq caractères avant la virgule décimale, avec des zéros en tête, puis trois chiffres après la décimale.

J'ai essayé printf("%05.3f", n) sur le système embarqué que j'utilise, mais il affiche *****. Le spécificateur de format est-il correct?

42
fred basset

Votre spécificateur de format est incorrect. À partir de la page de manuel printf() sur ma machine:

0 Un caractère zéro '0' indiquant que le remplissage nul doit être utilisé plutôt que le remplissage vide. Un '-' remplace un '0' si les deux sont utilisés;

Largeur de champ: une chaîne de chiffres facultative spécifiant une largeur de champ ; si la chaîne de sortie a moins de caractères que la largeur du champ, elle sera complétée par un blanc à gauche (ou à droite, si l'indicateur de réglage à gauche a été donné) pour compenser la largeur du champ (notez qu'un zéro de tête est un indicateur, mais un zéro intégré fait partie d'une largeur de champ);

Précision: une période facultative, '.', suivie d'une chaîne de chiffres facultative donnant une précision qui spécifie le nombre de chiffres à apparaître après la virgule décimale, pour e et f formats, ou le nombre maximum de caractères à imprimer à partir d'une chaîne; si la chaîne de chiffres est manquante, la précision est traitée comme zéro;

Pour votre cas, votre format serait %09.3f:

#include <stdio.h>

int main(int argc, char **argv)
{
  printf("%09.3f\n", 4917.24);
  return 0;
}

Sortie:

$ make testapp
cc     testapp.c   -o testapp
$ ./testapp 
04917.240

Notez que cette réponse est conditionnelle à ce que votre système embarqué ait une implémentation printf() qui soit conforme à la norme pour ces détails - de nombreux environnements embarqués ne le font pas avoir une telle implémentation.

56
Carl Norum