使用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
显然,当读取第一个数量时,我会超过标记。我无法弄清楚原因。感谢。
答案 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
该链接上有一些垃圾,但你可以得到它的要点。该链接仅指出问题的根本原因。我将用它来开发完整的解决方案并稍后发布。