代码之家  ›  专栏  ›  技术社区  ›  James Morris

如何消除同一程序的gui和命令行界面之间的语言环境差异?

  •  1
  • James Morris  · 技术社区  · 15 年前

    程序将设置文件保存为文本,其中包含类型为的浮点数 long double . 设置文件只能通过GUI(GTK2)保存,而文件也可以通过命令行加载,无需打开GUI。

    不幸的是,用户报告说,由于他的区域设置,在他保存的文件中,数字用逗号格式化,程序拒绝从命令行加载(发出错误消息),但似乎在GUI打开时加载。

    我已提出以下问题: MPFR, printf, decimal places, locales, file i/o problem 建议使用 setlocale(LC_ALL, "C") 我把它放在 main gtk_init_check 但同样,这没有什么区别( 编辑 在我安装了一些区域设置之后,它确实起到了作用。)

    我希望程序对保存的这些数据文件始终使用相同的语言环境设置(或非本地化语言环境设置-“C”),但不希望这样做会弄乱GUI。

    怎么用?

    3 回复  |  直到 7 年前
        1
  •  1
  •   vitaly.v.ch    15 年前

        2
  •  0
  •   unwind    15 年前

    如果您只能将这些值存储为 double ,我只建议使用glib的ASCII有限字符串格式化/解析功能:

    要将值转换为字符串,请调用 g_ascii_dtostr() . 要走另一条路,请使用 g_ascii_strtod() .

    我意识到这可能很糟糕,因为你从 long double (g)double 长双人 类型,你确定它真的能让你更精确吗?

        3
  •  -2
  •   James Morris    15 年前

    将正在使用的区域设置存储在加载/保存代码的顶部:

    char* loc = setlocale(LC_NUMERIC, NULL);
    

    然后,对于将数值写入文件调用的每个实例:

    setlocale(LC_NUMERIC, "C");
    /* code here for read/write of numeric values:
    fprintf(fd, "aspect %0.20lf\n", img->aspect);
    */
    setlocale(LC_NUMERIC, loc);
    

    我们应该做到这一点。