我需要读入一个值(cin),包括一个美元符号和一个美元金额,但我只想读入金额。
换句话说,我有这样的投入:"3458.5美元,"但我想读入并存储"3458.5"
我目前想到的方法是将值作为字符串读取,删除第一个字符,然后转换为双精度。但是,我觉得这种方法效率很低,还有更好的方法。有什么建议吗?谢谢
我同意马格努斯的观点:这似乎是次要的。但如果你真的想这么做,只需读一个字符,然后读一个双字符:
char ch;
double d;
std::cin >> ch >> d;
if(stream.peek() == '$') stream.get();
stream >> amount;
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
将而不是读取为3458.5
——它将被读取并存储为345850
——也就是说,硬币的数量。
然而,当您使用put_money
将数据写回时,它将与输入期间所做的任何操作对称地转换,因此,如果您输入$3458.5
,它将以相同的方式写回。
还有一个警告:我看到至少有一个实现对输入格式异常挑剔,所以在输入过程中需要小数点后0或2位数字,所以$3458.50
或$3458
读起来很好,但$3458.5
根本读不出来(这将被视为转换失败)。
如果使用scanf
而不是cin
,则可以删除$
(如果您知道它将一直存在),并将信息直接写入浮点值。
float d;
scanf("$%f", d);