Скажем, у меня есть сценарий оболочки POSIX, который
- должен работать в разных системах / средах, которые я не контролирую, и
- Необходимо удалить десятичный разделитель из строки, которая генерируется программой, которая учитывает настройки локали.
Как я могу определить десятичный разделитель самым общим способом?
shell
posix
locale
floating-point
gboffi
источник
источник
tcsh
в ..., о боже, вы определенно можете сказать, что я СТАРЫЙ !!!LC_ALL=C
среде?Ответы:
Спросите
locale
:Это выведет десятичную точку с использованием текущих настроек локали.
Если вам нужен разделитель тысяч:
источник
locale
GNUlibc
,locale -k LC_NUMERIC
чтобы перечислить все настройки локали в категории LC_NUMERIC.printf "%'f"
сделает это дляprintf
реализаций, которые поддерживают%f
.printf
а некоторые оболочки (например,dash
) не поддерживают интернационализированный вывод. В другом ответе Стефан Шазелас пояснил в комментарии , что POSIX этого не требуетсяlocale
не поддерживается.Если это
zsh
сценарий оболочки, вы можете использовать$langinfo
специальный ассоциативный массив вzsh/langinfo
модуле:(это соответствует стандарту
nl_langinfo(RADIXCHAR)
, подробности смотритеman nl_langinfo
в вашей системе;$langinfo[THOUSEP]
разделитель тысяч).В
bash
сценарии (также работающемzsh
) вы сможете получить его, не разветвляя отдельный процесс с помощьюprintf
встроенного:Чтобы преобразовать число из формата языкового стандарта пользователя в формат языкового стандарта C, с помощью оболочки ksh93 вы можете сделать это следующим образом:
источник
tmp=$(printf %.1f 0);tmp=${tmp#0};radix=${tmp%0}
printf
реализациях, которые поддерживают%f
, но не все.%f
поддержка не является обязательной для POSIX.printf
Изdash
, например , всегда использует.
dash
не интернационализируется ... Я только что нашел , что ... так что самое общее решение прибегнуть кlocale decimal_point
, не так ли?awk
также может интерпретировать числа в текущей локали в режиме POSIX (хотя не обрабатывает разделитель тысяч).