【问题标题】:MPFR, printf, decimal places, locales, file i/o problemMPFR、printf、小数位、语言环境、文件 i/o 问题
【发布时间】:2010-01-30 16:47:13
【问题描述】:

我的程序的用户报告了读取我的程序编写的设置文件的问题。我查看了有问题的设置文件,而不是使用句点“.”的小数点,而是使用逗号“,”。

我假设这与语言环境有关?

文件 i/o 使用 fprintf 和 mpfr_out_str 进行文件输出,getline 与 atol、atof、mpfr_set_str 等组合用于文件输入。

我在这里做什么?即使机器的语言环境想要使用逗号,我是否应该强制我的程序始终使用句点?如果是这样,我从哪里开始?

编辑:我刚刚注意到在指定要在命令行上使用的设置文件而不是通过 GUI 加载它时会出现此问题 - 这是否表明 OP 的机器或我的代码中存在问题?

【问题讨论】:

  • 感觉mpfr不负责浮点打印输出的本地化...
  • 是的,我也有这种感觉,因为无论使用 mpfr 还是 printf 例程,所有浮点值输出都是相同的。
  • 如果在 export LC_ALL=C 之后运行程序会发生什么?
  • 我无法亲自对此进行测试,因为问题发生在用户的机器上。

标签: c internationalization floating-point locale


【解决方案1】:

你会打电话给setlocale吗?如果没有,我建议将用于生成文件的语言环境嵌入到设置文件中或强制所有设置文件 I/O 使用 C 语言环境,通过 setlocale(LC_ALL, "C") 之前的建议。

另一种选择是使用特定于语言环境的格式化函数(在 MSVC 中以 _l 为后缀)并通过 _create_locale(LC_ALL, "C") 显式创建 C 语言环境。

【讨论】:

  • 啊,抱歉忘了提到 Linux。尽管如此,setlocale 是 C89... 强制 C 语言环境可接受的应用程序行为吗?
  • 我只能将 C 语言环境应用于数字格式,例如 setlocale(LC_NUMERIC, "C")。
  • 我终于接受了这个答案,但并非没有进一步调查。另见:stackoverflow.com/questions/2171527/…
  • 是的,好吧,理想情况下,您会在不使用特定于区域设置的格式(即,不是文本)的情况下存储这些数据,但这可能是一个完全不同的问题。
猜你喜欢
  • 2021-06-11
  • 2023-03-27
  • 1970-01-01
  • 2021-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
相关资源
最近更新 更多