setLocale用于从字符串中读取浮点数

时间:2015-09-23 10:55:43

标签: c++ ubuntu setlocale

我在Ubuntu上工作并使用英文键盘。当我想使用" strtof"从cpp中的字符串解析float时函数它假设逗号,而不是点作为浮点。作为一个已知的解决方案,我尝试使用setlocale(LC_NUMERIC," C")但是这仅在调用strtof的相同函数范围内有所帮助。但是,如果我需要将setlocale添加到每个函数范围,则需要花费太多时间。我试图在main函数中执行此操作,遗憾的是只修复了main的范围内的问题。

如何使其全球运作?

1 个答案:

答案 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