因此,我正在创建一个小型太阳系模拟,并用 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 函数,但我遇到了同样的问题。 知道如何解决这个问题吗?
(如果您需要有关代码或问题的更多信息,我随时为您服务)
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()
解决此问题的一种方法是将双数转换为字符串,然后您只需查找包含 "." 的索引并将其替换为 "," 即可。
您可以使用
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。它用逗号替换点并删除尾随零。