One way of getting money from C++ is a job, but today I learnt of an easier way, std::get_money
.
Taken from the cppreference page:
#include <iostream>
#include <sstream>
#include <locale>
#include <iomanip>
int main()
{
std::istringstream in("$1,234.56 2.22 USD 3.33");
long double v1, v2;
std::string v3;
in.imbue(std::locale("en_US.UTF-8"));
in >> std::get_money(v1) >> std::get_money(v2) >> std::get_money(v3, true);
if (in) {
std::cout << std::quoted(in.str()) << " parsed as: "
<< v1 << ", " << v2 << ", " << v3 << '\n';
} else {
std::cout << "Parse failed";
}
}
// "$1,234.56 2.22 USD 3.33" parsed as: 123456, 222, 333
Yeah. I love locales in my language!
Of course, if you decide that you have too much money, you can also std::put_money
back.
std::cout.imbue(std::locale("ja_JP.UTF-8"));
std::cout << "ja_JP: " << std::showbase << std::put_money(mon)
<< " or " << std::put_money(mon, true) << '\n';
// ja_JP: ¥123 or JPY 123
By the way, if you get too much money, it's possible that the authorities might come after you if you're not careful.
Don't forget to std::launder
it!
long double money;
std::cin.imbue(std::locale("en_US.UTF-8"));
std::cin >> std::get_money(money);
long double *safe_money_location;
if (money > 500000) {
// Not actually a useful use of std::launder, btw
safe_money_location = std::launder(&money);
} else {
safe_money_location = &money;
}
std::cout.imbue(std::locale("en_US.UTF-8"));
std::cout << "I have money: " << std::showbase
<< std::put_money(*safe_money_location) << '\n';
I mean, sure. C++ has locales, and locales have money. Still, C++ has some pretty funny things in the language.