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:
@@ -94,6 +94,8 @@ extern int qt_nvr_save(void);
|
||||
bool cpu_thread_running = false;
|
||||
}
|
||||
|
||||
#include <locale.h>
|
||||
|
||||
void qt_set_sequence_auto_mnemonic(bool b);
|
||||
|
||||
#ifdef Q_OS_WINDOWS
|
||||
@@ -525,6 +527,7 @@ main(int argc, char *argv[])
|
||||
|
||||
QApplication app(argc, argv);
|
||||
QLocale::setDefault(QLocale::C);
|
||||
setlocale(LC_NUMERIC, "C");
|
||||
|
||||
#ifdef Q_OS_WINDOWS
|
||||
Q_INIT_RESOURCE(darkstyle);
|
||||
|
||||
@@ -756,8 +756,9 @@ double
|
||||
ini_section_get_double(ini_section_t self, const char *name, double def)
|
||||
{
|
||||
section_t *section = (section_t *) self;
|
||||
const entry_t *entry;
|
||||
double value = 0;
|
||||
entry_t *entry;
|
||||
double value = 0;
|
||||
int res = 0;
|
||||
|
||||
if (section == NULL)
|
||||
return def;
|
||||
@@ -766,7 +767,17 @@ ini_section_get_double(ini_section_t self, const char *name, double def)
|
||||
if (entry == NULL)
|
||||
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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user