2010-03-04 7 views
4

Salut Je veux formater les numéros de flotteur tel qu'il sera affiché comme suit:nombre flottant Format

decimal.fraction

où décimaux = max 11 chiffres et fraction = max 9 chiffres

et si aucune partie de fraction ne doit afficher une fraction et pour plus de 11 chiffres en représentation décimale sera sous forme scientifique.

Quelqu'un peut-il m'aider?

Répondre

3

Je ne pense pas qu'il existe un format interne comme celui-ci. Vous devez le formater vous-même (non testé):

void fprintf_float(FILE* f, double value) { 
    if (-1e11 < value && value < 1e11) { 
    double d = fabs(value); 
    const char* sign = d > 0 ? "" : "-"; 
    double ipart, fpart; 
    char fpartstr[16]; 
    int pos; 
    fpart = modf(d, &ipart); 
    snprintf(fpartstr, 16, "%.9f", fpart); 
    for (pos = 10 /*strlen(fpartstr)-1*/; pos > 0; -- pos) 
     if (fpartstr[pos] != '0' && fpartstr[pos] != '.') 
     break; 
    fpartstr[pos+1] = '\0'; 
    fprintf(f, "%s%.11g%s", sign, ipart, fpartstr+1); 
    } else { 
    fprintf(f, "%.10e", value); 
    } 
} 
1

La bibliothèque standard ne peut pas le faire directement pour vous. Je suggère votre propre formateur décimal si vous avez besoin de cette mise en forme spécialisée, mais vous pouvez également le faire en mesurant la valeur et en définissant le mode et la précision appropriés pour la bibliothèque standard.

0

Comme ça?

#include <stdio.h> 
#include <string.h> 
#include <math.h> 

void printnum(double num_in) 
{ 
    char buff[32]; 
    char buff2[32]; 

    if (num_in >= 10000000000.0) 
    { 
     sprintf (buff, "%e", num_in); 
    } 
    else 
    { 
     char *pt; 
     unsigned long long tmp; 
     tmp = floor (num_in); 
     sprintf (buff, "%llu", tmp); 
     num_in -= tmp; 
     if(num_in < 1.0e-11) 
     { 
      printf("%s\n",buff); 
      return; 
     } 
     sprintf (buff2, "%10.9lf", num_in); 
     pt = memchr (buff2, '.', 32); 
     strcat (buff, pt); 
    } 
     printf("%s\n",buff); 
    } 

    int main(void) 
    { 
     double t = 100.0; 
     int i; 
     for(i=0;i<11;i++) 
     { 
     printf("%lf\t",t); 
     printnum(t); 
     t *= 12.3456; 
    } 
    return 0; 
} 
0

Je pense que les flux peuvent faire le travail.

#include <locale> 
#include <sstream> 

std::wostringstream out; 
out.imbue(std::locale::classic()); // Make sure a '.' is used as decimal point 
out.precision(9); // set fraction to 9 digits 

out << 1.2; 

const std::wstring str = out.str();