2012-10-11 2 views
9

나는 Cygwin에서의 이탈리아의 지역화를 사용하기 때문에 내의 printf 명령은 별도의 수레에 쉼표를 사용하고, 다른 기본적으로 모든 점을 사용하기 때문에 점으로 구분 된 수레bash에서 printf 명령의 소수 구분 기호를 어떻게 변경합니까?

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

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

이 몇 가지 문제를 일으킨다을 이해하지 못할 10 진수를 구분합니다.

어떻게 소수점 구분 기호를 쉼표에서 점으로 바꿀 수 있습니까?

답변

12

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을 일반 변수처럼 설정하면 작동하지 않으므로 내보내기 명령을 사용해야합니다.

당신은 스크립트의 헤더에이를 넣을 수 있습니다, 또는 당신은 당신의 ~/.bashrc 또는이 도움이되었다 당신의 ~/.bash_profile

희망에 추가하여 영구적으로 만들 수 있습니다! 당신은 시스템 구성에 혼란을 원하지 않는 경우

+1

'LC_NUMERIC = "en_US.UTF- 8 "로 설정되어 있지만 시스템 전체에서 설정이 변경되지는 않지만 설정이 완료된 스크립트 나 쉘의 범위에서 변경됩니다. 또한 명령에 대한 로케일을'LC_NUMERIC ="en_US로 변경할 수 있습니다. UTF-8 "printf"% f "3.1415'. – jarno

+1

설치 한 로캘과 독립적으로 작동하는 더 나은 (IMO) 솔루션에 대한 아래의 답변을 참조하십시오. – mav

6

, 당신은 당신의 로케일을 존중하지만 스크립트와 소수에 대한 점을 사용하여 확인 할 수 있습니다

당신은 단지 설정할 수
$ printf "%f" 3.5 
-bash: printf: 3,5: invalid number 
0.000000 

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

'LANG = C'가 충분하지 않고'LC_NUMERIC = C'가 더 잘 작동하는 경우가 있습니다. –

관련 문제