2012-10-11 14 views
9

używam włoskiej lokalizacji Cygwin i dlatego moja polecenia printf używa do odrębnych pływaków przecinki, i nie zrozumie kropka oddziela pływakówJak zmienić separator dziesiętny w komendzie printf w bash?

$ printf "%f" 3.1415 
-bash: printf: 3.1415: invalid number 
0,000000 

$ printf "%f" 3,1415 
3,141500 

Prowadzi to do wielu problemów, ponieważ w zasadzie wszystko wykorzystuje kropkę do oddzielania cyfr dziesiętnych.

Jak zmienić separator dziesiętny z przecinka na kropkę?

Odpowiedz

12

Istnieje kilka zmiennych lokalnych, które kontrolują lokalizację cygwin (lub dowolnej powłoki bash, w tej sprawie). Możesz zobaczyć je wraz z ich wartością, używając polecenia locale. Powinieneś zobaczyć coś takiego:

$ 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= 

Widać możliwych wartości zmiennych za pomocą locale -va. Wszystkie są sformatowane jak _.UTF-8. UTF-8 jest opcjonalny. Aby przełączyć się do stylu separacji float w Ameryce Północnej, po prostu ustaw LC_NUMERIC na wartość amerykańską.

$ export LC_NUMERIC="en_US.UTF-8" 

Po prostu ustawienie zmiennej LC_NUMERIC tak, jakby była zwykłą zmienną, nie będzie działać, musisz użyć polecenia eksportu.

Można umieścić to w nagłówku skryptach, lub można je na stałe, dodając je do swojej ~/.bashrc lub swojej ~/.bash_profile

nadzieję, że to był pomocny!

+1

Można po prostu ustawić 'LC_NUMERIC =" en_US.UTF- 8 "', ale to nie zmienia ustawienia w całym systemie, ale w zakresie skryptu lub powłoki, w której to ustawienie jest wykonywane. Poza tym możesz zmienić ustawienia narodowe tylko dla polecenia przez 'LC_NUMERIC =" en_US. UTF-8 "printf"% f "3.1415". – jarno

+1

Zobacz poniżej odpowiedź na lepsze rozwiązanie (IMO), które działa niezależnie od ustawień regionalnych, które zainstalowałeś. – mav

6

Jeśli nie chcą zadzierać z konfiguracji systemu, można szanować swoje lokum, ale upewnij się, że skrypt wykorzystuje kropki na dziesiętne z:

$ printf "%f" 3.5 
-bash: printf: 3,5: invalid number 
0.000000 

$ LANG=C printf "%f" 3.5 
3.500000 
+1

Istnieją przypadki, w których 'LANG = C' to za mało,' LC_NUMERIC = C' działa lepiej. –

Powiązane problemy