Как изменить десятичный разделитель в команде 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