История изменений
Исправление PPP328, (текущая версия) :
Я вот сейчас специально потратил около получаса, проверяя разные варианты установки разделителя. И таки знаете, что? Он вообще никак не устанавливается. Возможно это артефакт прошлого, возможно нужна Венера в Стрельце проходящая через дырку Юпитера.
Сразу говорю, я не пытался разбираться в вопросе через ман. Я просто перебирал варианты со стаковерлоу.
Я перепробовал:
struct lconv *ptrLocale = localeconv();
ptrLocale->decimal_point = ":";
ptrLocale->thousands_sep = "---";
Тотальный игнор. Даже если ставить один символ.
#include <libintl.h>
...
bindtextdomain("app", "/usr/share/locale");
setlocale(LC_NUMERIC, "");
struct lconv *ptrLocale = localeconv();
ptrLocale->thousands_sep = strdup("---");
Не работает.
newloc = newlocale(LC_ALL_MASK, "en_US.UTF-8", (locale_t)0))
ptrLocale = localeconv_l(newloc);
ptrLocale->thousands_sep[0] = '-';
ptrLocale->decimal_point[0] = ':';
Оказалось что на моей машине нет localeconv_l, потому что функция не входит в стандарт.
#include <xlocale.h>
Нет такого заголовка на моей машине
newloc = newlocale(LC_ALL_MASK, "en_US.UTF-8", (locale_t)0)
ptrLocale = localeconv();
ptrLocale->thousands_sep[0] = '-';
ptrLocale->decimal_point[0] = ':';
uselocale(newloc);
Это падает с сегфолтом.
setlocale(LC_ALL, "en_US.UTF-8");
ptrLocale = localeconv();
ptrLocale->thousands_sep[0] = '-';
ptrLocale->decimal_point[0] = ':';
Это тоже сегфолт
char *newThousandsSep = strdup("---");
free(ptrLocale->thousands_sep);
ptrLocale->thousands_sep = newThousandsSep;
ptrLocale->decimal_point = ":";
Сегфолт на том что free получил недопустимый аргумент
char newThousandsSep[2];
newThousandsSep[0] = '-';
newThousandsSep[1] = '\0';
ptrLocale->thousands_sep = newThousandsSep;
ptrLocale->decimal_point = ":";
Ничего не меняет.
Ну короче, если знаете, как поменять это на свой разделитель и с > 1 байта - дайте знать. Пока я только могу получить пробел и ‘,’, меняя встроенные кодировки.
А ну да, еще в инете предлагают пропатчить glibc.
Исходная версия PPP328, :
Я вот сейчас специально потратил около получаса, проверяя разные варианты установки разделителя. И таки знаете, что? Он вообще никак не устанавливается. Возможно это артефакт прошлого, возможно нужна Венера в Стрельце проходящая через дырку Юпитера. Я перепробовал:
struct lconv *ptrLocale = localeconv();
ptrLocale->decimal_point = ":";
ptrLocale->thousands_sep = "---";
Тотальный игнор. Даже если ставить один символ.
#include <libintl.h>
...
bindtextdomain("app", "/usr/share/locale");
setlocale(LC_NUMERIC, "");
struct lconv *ptrLocale = localeconv();
ptrLocale->thousands_sep = strdup("---");
Не работает.
newloc = newlocale(LC_ALL_MASK, "en_US.UTF-8", (locale_t)0))
ptrLocale = localeconv_l(newloc);
ptrLocale->thousands_sep[0] = '-';
ptrLocale->decimal_point[0] = ':';
Оказалось что на моей машине нет localeconv_l, потому что функция не входит в стандарт.
#include <xlocale.h>
Нет такого заголовка на моей машине
newloc = newlocale(LC_ALL_MASK, "en_US.UTF-8", (locale_t)0)
ptrLocale = localeconv();
ptrLocale->thousands_sep[0] = '-';
ptrLocale->decimal_point[0] = ':';
uselocale(newloc);
Это падает с сегфолтом.
setlocale(LC_ALL, "en_US.UTF-8");
ptrLocale = localeconv();
ptrLocale->thousands_sep[0] = '-';
ptrLocale->decimal_point[0] = ':';
Это тоже сегфолт
char *newThousandsSep = strdup("---");
free(ptrLocale->thousands_sep);
ptrLocale->thousands_sep = newThousandsSep;
ptrLocale->decimal_point = ":";
Сегфолт на том что free получил недопустимый аргумент
char newThousandsSep[2];
newThousandsSep[0] = '-';
newThousandsSep[1] = '\0';
ptrLocale->thousands_sep = newThousandsSep;
ptrLocale->decimal_point = ":";
Ничего не меняет.
Ну короче, если знаете, как поменять это на свой разделитель и с > 1 байта - дайте знать. Пока я только могу получить пробел и ‘,’, меняя встроенные кодировки.
А ну да, еще в инете предлагают пропатчить glibc.