LINUX.ORG.RU

История изменений

Исправление 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.