Программное изменение десятичного разделителя с помощью C setlocale ()

Прежде всего, это должно быть действительно решено в C и с помощью стандартных функций C UNIX (из-за ограничений проекта). Итак, C ++ или альтернативные библиотеки выходят за рамки вопроса.

Я знаю, как установить пользовательский языковой стандарт по умолчанию с помощью setlocale, а также установить стандартные языковые стандарты C / POSIX.

Однако я нахожусь в ситуации, когда десятичный разделитель указывается в файле, поэтому я хочу, чтобы моя программа временно изменила десятичный разделитель.

LC_NUMERIC ожидает имя языкового стандарта ... но я хочу давать ему не имя языкового стандарта, а непосредственно символ разделителя.

Как это может быть сделано?


person cesss    schedule 16.02.2016    source источник


Ответы (1)


Что ж, боюсь, решение вам не понравится :)

Прежде всего, поскольку вы работаете с setlocale, вы должны указать имя локали. Следовательно, должен быть языковой стандарт со свойством LC_NUMERIC, определенный вами во время выполнения программы. Поэтому вам необходимо определить новую локаль. Вы можете определить его с помощью localedef. Вы можете использовать этот документ в качестве руководства по созданию и использованию нового языкового стандарта и этот сайт, чтобы получить исходные файлы, которые можно использовать в качестве шаблона для определения пользовательского языкового стандарта.

person user3159253    schedule 16.02.2016
comment
На самом деле, мне это не нравится, однако причина не в объеме работы, а в том, что она связана с созданием системных файлов, которые должны быть установлены на пользовательском компьютере. Если бы новый языковой стандарт можно было настроить программно изнутри приложения без использования файлов локали, это было бы для меня нормально. - person cesss; 17.02.2016
comment
Нет. Взгляните на приведенный выше пример. Они описывают методы компиляции и использования языкового стандарта без его установки в системную папку. - person user3159253; 17.02.2016
comment
Обычно рецепт включает создание временной папки (mkdtemp), в которой файлы определения локали хранятся в эта папка, компиляция и последующее использование новой локали, опять же, из временного каталога. Возможно, потребовалось бы меньше усилий, чтобы использовать некоторые пользовательские функции форматирования чисел, которые не требуют локали как таковой, а требуют некоторого настраиваемого форматирования. Однако, если вы хотите / должны придерживаться местных настроек, я боюсь, что у вас нет другого выбора. - person user3159253; 17.02.2016