读入美元金额(带美元符号)C++
Read in Dollar Amount (with dollar sign) C++
我需要读入一个值(cin),包括一个美元符号和一个美元金额,但我只想读入金额。
换句话说,我有这样的输入:
“3458.5 美元,”
但我想读入并存储
“3458.5”
我想到的当前方法是将值作为字符串读取,删除第一个字符,然后转换为双精度值。但是,我觉得这种方法效率低下,还有更好的方法。有小费吗?谢谢!
我同意 Magnus 的观点:这似乎是次要的。但如果你真的想这样做,只读一个字符然后读一个双:
char ch;
double d;
std::cin >> ch >> d;
if(stream.peek() == '$') stream.get();
stream >> amount;
如果您使用 scanf
而不是 cin
,您可以删除 $
(如果您知道它会一直存在)并将信息直接写入浮点数。
float d;
scanf("$%f", d);
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";
}
现在,这里有几件事需要注意。首先也是最重要的,没有指定从外部表示到内部表示的转换,但是在我看到的实现中,58.5
将 not 读取为 3458.5
--它会被读取并存储为 345850
-- 即,硬币数量的计数。
当您使用 put_money
写回数据时,但是,它将与输入期间所做的任何操作对称地转换,因此如果您输入 58.5
,它将被写入原路返回。
还有一个警告:我至少看到过一种对输入格式异常挑剔的实现,因此在输入过程中它要求小数点后有 0 或 2 位数字,因此 58.50
或58
可以正常读取,但 58.5
根本不会被读取(它会被视为转换失败)。
我需要读入一个值(cin),包括一个美元符号和一个美元金额,但我只想读入金额。
换句话说,我有这样的输入: “3458.5 美元,” 但我想读入并存储 “3458.5”
我想到的当前方法是将值作为字符串读取,删除第一个字符,然后转换为双精度值。但是,我觉得这种方法效率低下,还有更好的方法。有小费吗?谢谢!
我同意 Magnus 的观点:这似乎是次要的。但如果你真的想这样做,只读一个字符然后读一个双:
char ch;
double d;
std::cin >> ch >> d;
if(stream.peek() == '$') stream.get();
stream >> amount;
如果您使用 scanf
而不是 cin
,您可以删除 $
(如果您知道它会一直存在)并将信息直接写入浮点数。
float d;
scanf("$%f", d);
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";
}
现在,这里有几件事需要注意。首先也是最重要的,没有指定从外部表示到内部表示的转换,但是在我看到的实现中,58.5
将 not 读取为 3458.5
--它会被读取并存储为 345850
-- 即,硬币数量的计数。
当您使用 put_money
写回数据时,但是,它将与输入期间所做的任何操作对称地转换,因此如果您输入 58.5
,它将被写入原路返回。
还有一个警告:我至少看到过一种对输入格式异常挑剔的实现,因此在输入过程中它要求小数点后有 0 或 2 位数字,因此 58.50
或58
可以正常读取,但 58.5
根本不会被读取(它会被视为转换失败)。