11

10 進数と整数の桁数を返す関数を作成し、挿入されtypenameた数値を s を使用して文字列に変換していますsstream

ただし、文字列に変換されたときの数値は、桁数を数えるのに役立たない科学的表記法で出てきますが、通常の数値です。以下の関数でこれが発生しないようにするにはどうすればよいですか?

enum { DECIMALS = 10, WHOLE_NUMBS = 20, ALL = 30 };

template < typename T > int Numbs_Digits(T numb, int scope)
{
    stringstream ss(stringstream::in | stringstream::out);
    stringstream ss2(stringstream::in | stringstream::out);
    unsigned long int length = 0;
    unsigned long int numb_wholes;

    ss2 << (int) numb;
    numb_wholes = ss2.str().length();
    ss2.flush();
    bool all = false;

    switch (scope) {
    case ALL:
        all = true;

    case DECIMALS:
        ss << numb;
        length += ss.str().length() - (numb_wholes + 1);  // +1 for the "."
        if (all != true)
            break;

    case WHOLE_NUMBS:
        length += numb_wholes;
        if (all != true)
            break;

    default:
        break;
    }
    return length;
}
4

2 に答える 2

30

std::fixedストリーム マニピュレータを次のように使用します。

ss << fixed << numb;

--

例、

#include <iostream>
using namespace std;

int main () {
  double a,b,c;
  a = 3.1415926534;
  b = 2006.0;
  c = 1.0e-10;
  cout.precision(5);
  cout       <<         a << '\t' << b << '\t' << c << endl;
  cout <<   fixed    << a << '\t' << b << '\t' << c << endl;
  cout << scientific << a << '\t' << b << '\t' << c << endl;
  return 0;
}

出力:

3.1416          2006            1e-010
3.14159         2006.00000      0.00000
3.14159e+000    2.00600e+003    1.00000e-010

例はここから取られます。

std::stringstreamの代わりに使用できますcoutが、結果は同じです。ここで実験してください:

http://www.ideone.com/HUrRw

于 2011-05-15T20:03:05.493 に答える
8

必要に応じて文字列をフォーマットするには、ストリーム マニピュレータを使用する必要があります。あなたの場合、おそらくfixedフォーマットフラグを使用したいと思うでしょう:

ss << std::fixed << numb;

反対に (科学表記法を強制したい場合) は、scientificフォーマット フラグです。

ss << std::scientific << numb;
于 2011-05-15T20:03:34.843 に答える