我需要读取包含美元符号和美元金额的值(cin),但我只想读取金额。
换句话说,我有这样的输入: " $ 3458.5," 但我想读入并存储 " 3458.5"
我想到的当前方法是以字符串形式读取值,删除第一个字符,然后转换为double。但是,我觉得这种方法效率低下,并且有更好的方法。有小费吗?谢谢!
答案 0 :(得分:4)
我同意马格努斯:这似乎很小。但如果你真的想这样做,只需阅读一个字符,然后阅读一个双字母:
char ch;
double d;
std::cin >> ch >> d;
答案 1 :(得分:2)
if(stream.peek() == '$') stream.get();
stream >> amount;
答案 2 :(得分:1)
如果您使用scanf
代替cin
,则可以删除$
,如果您知道它将始终存在并将信息直接写入浮点数。
float d;
scanf("$%f", d);
答案 3 :(得分:1)
C ++ 98/03有一个money_get
方面可以做这样的事情。不幸的是,使用它是相当痛苦的(说得好)。
C ++ 11增加了一个get_money
操纵器,使生活变得更加简单。它的工作原理如下:
#include <iostream>
#include <iomanip>
int main() {
long double amt;
std::cin.imbue(std::locale(""));
std::cout.imbue(std::locale(""));
std::cin >> std::get_money(amt);
std::cout << std::showbase << std::put_money(amt) << "\n";
}
现在,有几点需要注意。首先,没有指定从外部到内部表示的转换,但在我已经看到的实现中,$3458.5
将不读作{{1它被读取并存储为3458.5
- 也就是一个便士数量的计数。
然而,当您使用345850
将数据写回时,它会与输入过程中所做的任何操作对称转换,因此如果您输入了put_money
,那么它就会被删除以同样的方式写回来。
还有一点需要注意:我已经看到至少一个对输入格式有点奇怪的实现,因此在输入期间小数点后需要0或2位数,所以$3458.5
或者$3458.50
可以正常阅读,但$3458
根本无法阅读(它会被视为转换失败)。