2009-05-06 17 views
4

文字列を作成して、浮動小数点数の後に小数点または小数点以下の桁数を整数にするように書式を設定しますが、数値が大きいほど科学的表記法に切り替えることはできません。Cで%gの文字列形式

私は:

float myFloat= 15.6f; 
float myInt = 5.0f; 
float myLarge = 7000000.0f; 
sprintf(out, "my float is %g", myFloat); 
sprintf(out, "my int is %g", myInt); 
sprintf(out, "my large is %g", myLarge); 

私のようなものを得る:私はすべての単一フォーマットの15.6を与える文字列、5、および700000

編集をしたい

 
my float is 15.6 
my int is 5 
my large is 7e+07f 

を原因のコメントはフォーマットを行わない:

私が思ったことだ。フォーマット文字列が長い形式の文字列に埋め込まれているので、ラッパーはかなり不便です。

sprintf(buf, "%d %g", myInt, myFloat); 

どのようにラッピングしますか?

sprintf(buf, "%d %g", myInt, Wrapper(myFloat));?? 

ラッパーは何を返す必要がありますか?または悪化:

sprintf(buf, "%d %s", myInt, Wrapper(myFloat));?? 
+0

まで表示する%グラムと%0.10グラムを交換してください。* fの場合は、次のようにします。 sprintf(buf、 "%d%。* f"、myint、getPlaces(myFloat)、myFloat); フォーマット文字列を生成するためのラッパーは必要ありません。 –

答えて

5

%gと入力すると、%g%eまたは%fのほうが短いと思われます。

したがって、私はあなたを満たすprintf引数が1つしかないと思います。 15.6では%2.1fを使用できます。 7000000の場合は%7.0fを使用できます。

おそらく、値のサイズを調べ、正しいprintf引数を適用するラッパー関数を記述するのが最もよい方法です。

+0

ええ、それは私が思ったものです。フォーマット文字列が長い形式の文字列に埋め込まれているので、かなり不便です。 > sprintf(buf、 "%d%g"、myInt、myFloat); どのようにラッピングしますか? > sprintf(buf、 "%d%g"、myInt、Wrapper(myFloat)); ラッパーは何を返すべきですか?または悪い: > sprintf(buf、 "%d%s"、myInt、Wrapper(myFloat)); –

+0

ここにa:my_sprintfを書いてください。定義したトークン(%yなど)を確認し、置き換えて、置き換えられた文字列をその下のsprintfの下に置きます。このようにして、my_sprintf(buf、 "%d%y"、myInt、myFloat); – joce

+0

実際の文字列を渡す代わりに、my_sprintfでMike Kaleのトリック(%。* f)を使用できます。 – joce

10

"%。* f"で書式設定すると、精度を別のパラメータとして渡すことができます。 sprintf。私は0、1、2、または多分3桁の余分な末尾の0を表示せずに表示したかったとき、これを過去に使用しました。 double/floatをとり、整数精度を返します(1000を掛けてから10,100,1000を法とする)。その後、 "%。* f"を指定してsprintfを呼び出し、ヘルパー関数を呼び出してfloatを渡します。

+0

+1これは本当に素敵です!私はこれについて知らなかった。 – rampion

1

マイクのアプローチは合理的ですが、log10関数を使用して直接桁数を計算し、floorまたはceilを使用して、実際に整数値を持つことを確認できます。何かのように:

#include <math.h> 
double x; 
... 
if (floor(x) == x && x != 0.0) { // x is an non-zero integer value 
    int digits = floor(log10(fabs(x)+0.5)) + 1; 
    printf("x is %.*f\n", digits, x); 
} 

関数呼び出しの連鎖を開梱、我々はまず、引数が非負であることを確認するために、絶対値を取るコンピューティングのすべての可能な丸め誤差の世話をすることが知られている整数値に0.5を追加します10の正確な累乗のlog10、log10とfloorを組み合わせてfabs(x)+0.5より小さい10の最大累乗の指数を求め、最後に1を加えてxを表現するのに必要な桁数を得る。ここではいくつかのサンプル値(OpenOfficeのから、しかし、Cのlog10の機能は、同様の精度で計算する必要があります)、次のとおりです。

  x   log10(x+0.5) 
     1 0.176091259055681000 
     9 0.977723605288848000 
     10 1.021189299069940000 
     99 1.997823080745730000 
     100 2.002166061756510000 
     999 2.999782798454140000 
     1000 3.000217092972230000 
    10000 4.000021714181250000 
    100000 5.000002171466980000 
    1000000 6.000000217147190000 
    10000000 7.000000021714720000 
100000000 8.000000002171470000 
1000000000 9.000000000217150000 
+0

私はOPが数字の順序ではなく、小数点以下の桁数を望んでいると思います。 1 + floor(log10(1.234 + 0.5))は1で、私は望んでいません。3 –

+0

Mikeの連続的なmod演算のポイントは、小数点以下の桁数を調べることでした。非整数値私はSeanの要求の一部に、整数値の末尾に数字または小数点がないことに焦点を当てていました。必要な全体的な精度を計算するために、2つのアプローチを組み合わせて小数点の前後の桁を把握することができます。 – dewtell

1

あなたは%を使用している場合は10桁の有効数字