2015-04-28 62 views
6

這是我的print語句:如何格式化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); 

我不知道,我應該做一個for循環輸出各一個(積極的結果vs消極的結果)以不同的格式?

+7

現在* *這就是我所說的規格!你在找項目經理職位嗎? – Bathsheba

+3

這是怎麼得到upvotes。答案是一個網絡搜索。 –

+0

@ rr-我對如何格式化一切感到困惑,我是C新手:) – Elsa

回答

2

嘗試計算的權力首先使用pow()math.h然後:

您可以使用%10F是先於總例如10位用空格數量:

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

來源:cplusplus.com

+0

但是對於浮點部分,OP需要'%f'或其他相關的東西。 –

+0

是的,我相信我需要%f格式化程序 – 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

Basicly可以使用可變長度來執行此:比其他方法

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()不能打印十進制數字variating長度,所以基本上我所做的是打印格式的數字到緩衝區中,然後切超出零。

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