memomemo

asしかやった事ない私がつまずいたとこメモです。なんか間違ってたらコメントください。

C++数値の3桁区切り

三桁で区切って 1,000,000 って表示したい!
ってことでググりました。

こちら↓の方のものを使わせてもらったんですが
とあるソフトウェアエンジニアのブログ

std::string formatNumber(int num)
{
    std::vector<int>    sepnum;
    int                 number = abs(num);
    int                 sgn = num >= 0 ? 1 : -1;

    while ( number / 1000 ) {
        sepnum.push_back(number % 1000);
        number /= 1000;
    }

    std::stringstream  ss;
    ss << number * sgn;
    for ( std::vector<int>::reverse_iterator i = sepnum.rbegin();
                                        i < sepnum.rend(); i++ ) {
        ss << "," << std::setfill('0') << std::setw(3) << *i;
    }
    return std::string(ss.str());
}

知らないものが沢山Σ(゚Д゚ ;)
ってことで調べました。


std::stringstream
そのまま文字列ストリームなんだが、
"<<" で色々な型を文字列化してくれる。
中はこんな感じでいろんな方を受け取れるようになってる

ostream& operator<< (bool& val );
...
ostream& operator<< (ostream& out, char c );


イテレーターは長いので別記事でー



std::setfill('0') << std::setw(3)
std::stringstreamに << して何かごちゃごちゃしてるんだか。そもそもこれらは↓

  • 入出力マニピュテータという特殊な関数
  • マニピュレータとは、iostream に挿入したり、iostream から抽出したりする値で特別な効果を持つもの

で結構種類がある。

std::cout << "aaa" << std::endl;

の endlもそーなのねー
他の種類はこちら

std::setfill('0')
は引数で指定した文字列で埋める
std::setw(3)
は3つの幅とれよー

ってことで
000 が確保されるんだと。
そこに << 2 とかやると
002になる!


理解!!