使用money_get<>解析USD和$ amount时出错

时间:2018-01-17 13:47:08

标签: c++

使用money_get<>解析USD和$ amount时出错。

#include <iostream>         /// cin, cout
#include <locale>
#include <iterator>

using namespace std;


int main()
{
    cin.imbue(std::locale("en_US.UTF-8"));

    std::cout << "USD  1.11$2.22"
              << " parsed with the facet directly: ";

    auto& f = std::use_facet<std::money_get<char>>(cin.getloc());
    std::ios_base::iostate err;
    std::istreambuf_iterator<char> frm(cin), end;
    long double val;

    /// international currency symbol
    frm = f.get(frm, end, true, cin, err, val);
    std::cout << "\n "<< val/100;

    string str;
    cin >> str;
    cout << "\n remaining: " << str << endl;

    /// local currency symbol
    f.get(frm, end, false, cin, err, val);
    std::cout << "\n "<< val/100;
}    

http://coliru.stacked-crooked.com/a/b1f76385cbed6834

输入是:

USD  1.11
$2.22

输出结果为:

USD  1.11$2.22 parsed with the facet directly: 
 1.11
 remaining: .22
 0

来自相应的moneypunct&lt;&gt;的模式。方面是:   对于美元:符号符号空间值   for $:sign symbol value none

显然,当读取第一个数量时,我会超过标记。我无法弄清楚原因。感谢。

2 个答案:

答案 0 :(得分:0)

我已经进一步隔离了这个问题。

它似乎不是get_money()操纵器或money_get&lt;&gt;的问题。面。

这是字符串v / s cin的问题 - 使用本地货币(例如:$)指定的货币金额的输入可以从istringstream正确工作,但不能从cin工作。

请注意,我已从cppreference.com修改了以下一些代码。

http://coliru.stacked-crooked.com/a/19e0fdc663c5d845

使用本地货币(例如:$)指定的货币金额的输入可以从istringstream正确运行:

string str = "$1.11 $2.22 $3.33 4.44 5.55";


void stringInput()          /// works
{
    cout << "string Input ... works:\n";

    istringstream s1(str);
    s1.imbue(locale("en_US.UTF-8"));

    cout << fixed << setprecision(2);
    cout << '"' << str << "\" parsed with the I/O manipulator: ";

    long double val;

    while(s1 >> get_money(val))
        cout << val/100 << ' ';

    cout << "\n";
}

输出:

string Input ... works:
"$1.11 $2.22 $3.33 4.44 5.55" parsed with the I/O manipulator: 1.11 2.22 3.33 4.44 5.55 

使用本地货币(例如:$)指定的货币金额输入从cin(同一链接)错误

void cinInput()             /// does not work
{
    cout << "cin Input ... doesn't work:\n";

    cin.imbue(locale("en_US.UTF-8"));

    cout << fixed << setprecision(2);
    cout << '"' << str << "\" parsed with the I/O manipulator: ";

    long double val;

    while(cin >> get_money(val))
        std::cout << val/100 << ' ';
    cout << '\n';
}

输出:

cin Input ... doesn't work:
"$1.11 $2.22 $3.33 4.44 5.55" parsed with the I/O manipulator: 0.11 0.22 0.33 0.44 0.55 

答案 1 :(得分:0)

好的,我终于精确地确定了问题并解决了它。

问题的根本原因根本不是C ++问题。 cin,istringstream,get_money()和money_get&lt;&gt;一切正常。

这基本上是输入问题。

考虑以下输入字符串:

\$1.11 \$2.22 \$3.33 \$4.44 \$5.55

输入离线时,输入完全正确读取。

但是,当输入在线时,&#34; $ 1&#34;,&#34; $ 2&#34;,&#34; $ 3&#34;等等没有读入输入。它们被视为特殊字符。这就是为什么在coliru(以及可能的任何其他在线C ++引擎)上,$ amount无法正确读取。这可能是一个UNIX问题,其中$被视为特殊字符。

解决方案是逃避它:而不是$,输入\ $。

$rootScope.$broadcast('someEventFired', { any: {} });

http://coliru.stacked-crooked.com/a/e2043935559f6d40

该链接上有一些垃圾,但你可以得到它的要点。该链接仅指出问题的根本原因。我将用它来开发完整的解决方案并稍后发布。