读入美元金额(带美元符号)C++

Read in Dollar Amount (with dollar sign) C++

本文关键字:美元 符号 C++ 金额      更新时间:2023-10-16

我需要读入一个值(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);