2010-03-04 14 views
4

Привет Я хочу форматировать числа с плавающей точкой, так что он будет отображаться следующим образом:Формат числа с плавающей точкой

decimal.fraction

где десятичные = макс 11 цифр и часть = макс 9 цифр

и если ни одна фракционная часть не должна отображаться не долей и более 11 цифр в представлении десятичной части будут в научной форме.

Может ли кто-нибудь мне помочь?

ответ

3

Я не думаю, что есть такой внутренний формат. Вам необходимо отформатировать его самостоятельно (не тестировалось):

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

Стандартная библиотека не может напрямую сделать это за вас. Я бы предложил ваш собственный десятичный форматировщик, если вам нужно это специализированное форматирование, но вы также можете сделать, измерив значение, а затем установив правильный режим и точность для стандартной библиотеки.

0

Нравится?

#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

Я думаю, что потоки могут справиться с этой задачей.

#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(); 
Смежные вопросы