我在Ubuntu上工作并使用英文键盘。当我想使用" strtof"从cpp中的字符串解析float时函数它假设逗号,而不是点作为浮点。作为一个已知的解决方案,我尝试使用setlocale(LC_NUMERIC," C")但是这仅在调用strtof的相同函数范围内有所帮助。但是,如果我需要将setlocale添加到每个函数范围,则需要花费太多时间。我试图在main函数中执行此操作,遗憾的是只修复了main的范围内的问题。
如何使其全球运作?
答案 0 :(得分:1)
您可以设置全局区域设置:
std::locale::global(std::locale("C"));//default.
哪个应该影响依赖于全局区域设置的所有函数。
请注意,cout(我假设cin和cerr)在创建时充满了全局语言环境。即使代码的第一行设置全局区域设置,也可能先前已创建了流,因此您必须使用新的区域设置填充流。
如果您在其他地方需要特定于语言环境的行为,但不希望默认情况下您的号码格式混乱,boost::locale解决了此问题 - 您可以看到以下问题:What are the tradeoffs between boost::locale and std::locale?
以下是输出示例,但解析行为完全相同:
auto demo = [](const std::string& label)
{
float f = 1234.567890;
std::cout << label << "\n";
std::cout << "\t streamed: " << f << "\n";
std::cout << "\t to_string: " << std::to_string(f) << "\n";
};
std::locale::global(std::locale("C"));//default.
std::cout.imbue(std::locale()); // imbue cout with the global locale.
demo("c locale");
std::locale::global(std::locale("de_DE"));//default.
std::cout.imbue(std::locale()); // imbue cout with the global locale.
demo("std de locale");
boost::locale::generator gen;
std::locale::global(gen("de_DE.UTF-8"));
std::cout.imbue(std::locale()); // imbue cout with the global locale.
demo("boost de locale");
其中提供了以下结果:
c locale
streamed: 1234.57
to_string: 1234.567871
std de locale
streamed: 1.234,57
to_string: 1234,567871
boost de locale
streamed: 1234.57
to_string: 1234,567871