Как изменить десятичный разделитель в команде printf в bash?
Я использую итальянскую локализацию Cygwin, и поэтому моя команда printf использует запятые для разделения поплавков и не будет понимать разделенные точками поплавки
$ printf "%f" 3.1415
-bash: printf: 3.1415: invalid number
0,000000
$ printf "%f" 3,1415
3,141500
Это порождает ряд проблем, потому что в основном все остальное использует многоточие для разделения десятичных знаков.
Как изменить десятичный разделитель с запятой на точку?
2 ответов
есть несколько локальных переменных, которые управляют локализацией cygwin (или любой оболочки bash, если на то пошло). Вы можете увидеть их вместе с их значением, используя . Вы должны увидеть что-то вроде этого:
$ locale
LANG=it_IT.UTF-8
LC_CTYPE="it_IT.UTF-8"
LC_NUMERIC="it_IT.UTF-8"
LC_TIME="it_IT.UTF-8"
LC_COLLATE="it_IT.UTF-8"
LC_MONETARY="it_IT.UTF-8"
LC_MESSAGES="it_IT.UTF-8"
LC_ALL=
вы можете увидеть возможные значения переменных, используя locale -va
. Все они отформатированы как _.UTF-8. UTF-8 является необязательным.
Чтобы переключиться на североамериканский стиль разделения поплавков, просто установите LC_NUMERIC на свой американский значение.
$ export LC_NUMERIC="en_US.UTF-8"
просто установка переменной LC_NUMERIC, как если бы это была обычная переменная, не будет работать, вам нужно использовать команду export.
вы можете поместить это в заголовке скриптов, или вы можете сделать его постоянным, добавив его в ~/.bashrc
или ~/.bash_profile
надеюсь, это было полезно!
Если вы не хотите возиться с конфигурацией системы, вы можете уважать свою локаль, но убедитесь, что ваш скрипт использует точки для десятичных знаков с:
$ printf "%f" 3.5
-bash: printf: 3,5: invalid number
0.000000
$ LANG=C printf "%f" 3.5
3.500000