1

文字列にintを取得するためにstringstreamsを使用しようとしています。私はこのようにします:

std::string const DilbertImage::startUrl = "http://tjanster.idg.se/dilbertimages/dil";
std::string const DilbertImage::endUrl = ".gif";

 DilbertImage::DilbertImage(int d)
{
    cal.setDate(d);

    int year, month, date;

    year = cal.getYear();
    month = cal.getMonth();
    date = cal.getNumDate();

    std::stringstream ss;

    ss << year << "/";

    if(month < 10)
    {
        ss << 0;
    }

    ss << month << "/" << "Dilbert - " << cal.getNumDate() << ".gif";

    filePath = ss.str();

    ss.str("");
    ss.clear();

    ss << startUrl << date << endUrl;

    url = ss.str();

    std::cout << url << '\t' << filePath << std::endl;
}

次のような 2 つの素敵な文字列が得られることを期待しています。

url: http://tjanster.idg.se/dilbertimages/dil20060720.gif
filePath: /2006/07/Dilbert - 20060720.gif

しかし、代わりに、文字列ストリームにintを入れると、どういうわけかスペース(またはそれらの途中に挿入された他の空白文字)が得られます。コンソールウィンドウから貼り付けると、文字は*として表示されます。

最終的には次のようになります。

url: http://tjanster.idg.se/dilbertimages/dil20*060*720.gif 
filepath: /2*006/07/Dilbert - 20*060*720.gif

なぜこうなった?

プロジェクト全体は次のとおりです。http://pastebin.com/20KF2dNL

4

1 に答える 1

5

その"*"文字は千単位の区切り文字です。誰かがあなたのロケールをいじっています。

これはそれを修正するかもしれません:

std::locale::global(std::locale::classic());

ファセットをオーバーライドするだけの場合numpunct(数値のフォーマット方法を決定します):

std::locale::global(std::locale().combine<std::numpunct<char>>(std::locale::classic()));

あなたの場合、スウェーデン語のロケールを設定しているとき:

std::locale swedish("swedish");
std::locale swedish_with_classic_numpunct = swedish.combine<std::numpunct<char>>(std::locale::classic());
std::locale::global(swedish_with_classic_numpunct);
于 2012-07-11T10:29:42.690 に答える