GTK fprint(%e) 用逗号而不是点书写的浮点数

问题描述 投票:0回答:2

因此,我正在创建一个小型太阳系模拟,并用 C 语言完成微积分。计算完成后,我将它们放入一个 json 文件中,该文件由网页读取。

我创建了一个函数将轨迹的坐标保存到json文件中,所有坐标都是双精度的。为了将 double 打印到我的 json 文件中,我使用 fprintf 和 %e (是的,我想要科学写作)。

FILE *fp = NULL;
fp = fopen("file.json", "w");    
fprintf(fp, "[[%e, %e, %e],[%e, %e, %e], %d],\n", pos.x, pos.y, pos.z, speed.x, speed.y, speed.z, time);

我的问题是,当我在 main.c 中使用该函数时,它会按照我想要的方式用点写入双精度数(例如:3.14),但是当我在 Gtk 中使用该函数时,它会用逗号写入它们(例如:3, 14).

我尝试使用 GTK 的 g_fprintf 内置 fprintf 函数,但我遇到了同样的问题。 知道如何解决这个问题吗?

(如果您需要有关代码或问题的更多信息,我随时为您服务)

c floating-point printf gtk
2个回答
5
投票

gtk
更改区域设置,在调用
setlocale
 后立即使用 
gtk_init

切换到默认值
#include <locale.h>

int main(int argc, char *argv[])
{
    gtk_init(&argc, &argv);
    setlocale(LC_NUMERIC, "C");

或者您可以在

gtk_disable_setlocale();
gtk_init()
 之前先拨打 
gtk_application_new()


0
投票

解决此问题的一种方法是将双数转换为字符串,然后您只需查找包含 "." 的索引并将其替换为 "," 即可。

您可以使用

snprintf();
来执行此操作。您所需要的只是存储双精度值的字符串、所述字符串的最大长度格式说明符和保存您的值的变量

示例代码:

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #define LENGTH 1000u int findStringLength(char* userString) { int stringLength = 0; size_t index = 0; while (userString[index] != '\0') { if (userString[index] != '\0') { stringLength++; index++; } } return stringLength; } void dotFinder(char* string) { size_t finder; size_t nextIndex; for (size_t index = findStringLength(string); index > 0; index--) { if (string[index] == '.') { string[index] = ','; break; } } for (size_t index = findStringLength(string); index > 0; index--) { nextIndex = index + 1; finder = string[index]; if (string[index] == '0' || string[index] == '\0') { string[index] = '\0'; } else if (string[index] == '.' && string[nextIndex] == '\0') { string[index] = ','; break; } else if (string[index] != '0') { break; } } } int main() { double doubleVariable = 304.402000; char doubleString[LENGTH] = { '\0' }; snprintf(doubleString, LENGTH, "%lf", doubleVariable); dotFinder(doubleString); printf(doubleString); }
上面的代码输出

304,402。它用逗号替换点并删除尾随零。

© www.soinside.com 2019 - 2024. All rights reserved.