2015-04-28 2 views
6

Это мой оператор печати:Как преобразовать десятичные числа в C?

printf("%d  %f\n",kPower, raisePower); 

Это мой выход:

-4  0.000100 
-3  0.001000 
-2  0.010000 
-1  0.100000 
0  1.000000 
1  10.000000 
2  100.000000 
3  1000.000000 
4  10000.000000 

Я хочу, чтобы это было напечатано так:

enter image description here

UPDATE

Так что я сделал мои положительные значения выстраиваться:

-4   0.0 
-3   0.0 
-2   0.0 
-1   0.1 
0   1.0 
1   10.0 
2   100.0 
3   1000.0 
4  10000.0 

Это мой новый код до сих пор:

printf("%d  %10.1f\n",kPower, raisePower); 

Я не знаю, должен ли я сделать цикл для печати каждого из них (положительные результаты против отрицательного результата) в другом формате?

+7

Теперь * это * является то, что я называю спецификации! Вы ищете должность менеджера проекта? – Bathsheba

+3

Как получилось, что это вверх. Ответ - это один веб-поиск. –

+0

@ rr- Я запутался в том, как отформатировать все, я новичок в C :) – Elsa

ответ

2

Попытка вычисления силы сначала с помощью pow() из math.h, а затем:

Вы можете использовать% 10f, чтобы поставить перед числом пробелов в примере общей сложности 10 пространств:

printf ("Preceding with blanks: %10f \n", 10000.01); 

Источник: cplusplus.com

+0

Но для части с плавающей запятой OP требует '% f' или что-то связанное. –

+0

Да, я считаю, что мне нужен формат ff – Elsa

+2

В принципе, '% 10.5f', но только печатать десятичные знаки, если они необходимы. Я не думаю, что что-то 'printf()' может делать напрямую, я был бы удивлен, если бы был способ. – Havenard

1

Попробуйте этот пример кода

float y[7]={0.000100f,0.0010f,0.0100,0.1000f,1.0f,10.000f,100.00f}; 
int a[7]={-4,-3,-2,-1,0,1,2}; 
for(int i=0;i<7;i++) 
    printf("%2d%20f\n",a[i],y[i]); 

Выход будет таким.

enter image description here

+1

Да, но это не то, что требовалось. – glglgl

+0

@glglgl, yaa Я знаю, проблема связана с завершением '0'. – Himanshu

2

Основном вы можете использовать переменную длину для выполнения этого:

printf("%d %.*lf", kPower, -kPower, raisePower); 

преимущества по сравнению с другими методами является то, что этот метод не требует какого-либо дополнительный буфера (ов)

3
#include <stdio.h> 

char *get_number_formatted(double f) 
{ 
    static char buf[128]; // this function is not thread-safe 
    int i, j; 

    i = snprintf(buf, 128, "%20.10f", f) - 2; 

    for (j = i - 8; i > j; --i) 
     if (buf[i] != '0') 
      break; 

    buf[i + 1] = '\0'; 
    return buf; 
} 

int main(void) 
{ 
    int i; 
    for (i = -4; i < 5; ++i) 
     printf("%5d %s\n", i, get_number_formatted(pow(10.0, i))); 
    return 0; 
} 

http://ideone.com/KBiSu0

Выхода:

-4   0.0001 
    -3   0.001 
    -2   0.01 
    -1   0.1 
    0   1.0 
    1  10.0 
    2  100.0 
    3  1000.0 
    4  10000.0 

printf() не может печатать длину изменяющейся десятичных цифр, поэтому в основном то, что я делал, был напечатать форматированный номер в буфер, а затем разрезать преизобильные нули.

2

С небольшой помощью modf, вы можете использовать %g пропустить замыкающие нули и \b пропустить ведущего нуля:

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

int main(void) 
{ 
    int i, iarr[] = {-4, -3, -2, -1, 0, 1, 2, 3, 4}; 
    double darr[] = {0.0001, 0.001, 0.01, 0.1, 1., 10., 100., 1000., 10000.}; 
    double intpart, fractpart; 

    for (i = 0; i < 9; i++) { 
     fractpart = modf(darr[i], &intpart); 
     if (fractpart == 0.0) 
      printf("%10d%10d.0\n", iarr[i], (int)intpart); 
     else 
      printf("%10d%10d\b%g\n", iarr[i], (int)intpart, fractpart); 
    } 
    return 0; 
} 

Выход:

-4   0.0001 
    -3   0.001 
    -2   0.01 
    -1   0.1 
    0   1.0 
    1  10.0 
    2  100.0 
    3  1000.0 
    4  10000.0 
1

Вы можете использовать sprintf, а затем обрезать нули. Это та же идея, что и ответ @ Havenard, но записывая пробелы над нулями вместо того, чтобы разрезать строку. И мой C-стиль несколько отличается от FWIW. Мой стиль в том, что я не хочу считать или делать арифметику в моей голове; вот для чего нужен оптимизатор C :).

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

int main() { 
    int kPower; 
    for(kPower=-4; kPower<5; kPower++){ 
     enum { bufsize = 2+5+10+1+4+1+1 }; 
     char buf[bufsize]; 
     int j,n,i; 
     double raisePower = pow(10,kPower); 
     //printf("%2d  %10.4f\n",kPower,raisePower); 
     snprintf(buf,bufsize,"%2d  %10.4f\n",kPower,raisePower); 
     j=strchr(buf,'.')-buf; 
     j+=1; 
     n=strchr(buf+j,'\n')-buf; 
     for (i=n-1; i>j; i--) 
      if (buf[i]=='0') 
       buf[i]=' '; 
      else 
       break; 
     printf("%s",buf); 
    } 
    return 0; 
} 

Выход:

-4   0.0001 
-3   0.001 
-2   0.01 
-1   0.1 
0   1.0 
1  10.0 
2  100.0 
3  1000.0 
4  10000.0 
0

использование Printf так:

printf("%5d %10.1f\n",kPower, raisePower); 

this will result in kPower being printed, 
    right justified, 
    in 5 columns 
    - sign in the right place 

this will result in raisePower being printed with: 
    10 columns 
    leading 0s replaced by spaces 
     except 1 digit (could be 0) to the left of the decimal point 
    1 (rounded) digit to the right of the decimal point 
    - signs being printed at the proper location 
    decimal point being aligned 
Смежные вопросы