Set LC_NUMERIC to "C" in program startup

For whatever fucking reason, glibc's functions dealing with decimal numbers apparently can only accept either commas or dots in strings, but not both. Meanwhile, both Windows and macOS have no apparent issues accepting both.

I will never understand why they decided to even consider such behaviour acceptable, especially since those ARE used for parsing decimal numbers in many programs, but I guess it's their own version of Not Invented Here syndrome that they (or anyone else) can't be bothered to deal with. This is not how good C standard libraries are written, at all.
This commit is contained in:
Cacodemon345
2025-03-29 01:18:37 +06:00
parent 524db95838
commit dd0e626133
2 changed files with 17 additions and 3 deletions

View File

@@ -94,6 +94,8 @@ extern int qt_nvr_save(void);
bool cpu_thread_running = false; bool cpu_thread_running = false;
} }
#include <locale.h>
void qt_set_sequence_auto_mnemonic(bool b); void qt_set_sequence_auto_mnemonic(bool b);
#ifdef Q_OS_WINDOWS #ifdef Q_OS_WINDOWS
@@ -525,6 +527,7 @@ main(int argc, char *argv[])
QApplication app(argc, argv); QApplication app(argc, argv);
QLocale::setDefault(QLocale::C); QLocale::setDefault(QLocale::C);
setlocale(LC_NUMERIC, "C");
#ifdef Q_OS_WINDOWS #ifdef Q_OS_WINDOWS
Q_INIT_RESOURCE(darkstyle); Q_INIT_RESOURCE(darkstyle);

View File

@@ -756,8 +756,9 @@ double
ini_section_get_double(ini_section_t self, const char *name, double def) ini_section_get_double(ini_section_t self, const char *name, double def)
{ {
section_t *section = (section_t *) self; section_t *section = (section_t *) self;
const entry_t *entry; entry_t *entry;
double value = 0; double value = 0;
int res = 0;
if (section == NULL) if (section == NULL)
return def; return def;
@@ -766,7 +767,17 @@ ini_section_get_double(ini_section_t self, const char *name, double def)
if (entry == NULL) if (entry == NULL)
return def; return def;
sscanf(entry->data, "%lg", &value); res = sscanf(entry->data, "%lg", &value);
if (res == EOF || res <= 0) {
int i = 0;
for (i = 0; i < strlen(entry->data); i++) {
if (entry->data[i] == ',') {
entry->data[i] = '.';
entry->wdata[i] = L'.';
}
}
(void)sscanf(entry->data, "%lg", &value);
}
return value; return value;
} }