현재 소수점 구분 기호는 무엇입니까?


29

POSIX 쉘 스크립트가 있다고 가정 해보십시오.

  1. 내가 통제하지 않는 다른 시스템 / 환경에서 실행해야하며
  2. 로케일 설정을 존중하는 프로그램에서 생성 한 문자열에서 소수점 구분 기호를 제거해야합니다.

가장 일반적인 방식으로 소수점 구분 기호를 어떻게 감지합니까?


어떤 종류의 스크립트? 어디에서 달리고 있습니까? 답변 할 수 있도록 질문을 업데이트하십시오.
X Tian

@XTian 유닉스 / 리눅스 시스템에서 실행되는 일반적인 쉘 스크립트. question 질문의 마지막 줄에 지정된 것처럼 가장 일반적인 답변에 관심이 있기 때문에 의도적으로 가장 일반적인 방식으로 질문을 제기했습니다.
gboffi

1
@ StéphaneChazelas POSIX 스크립트! 정직한, 나는 내가 사용했던 것을 잊었다 tcsh..., 오 마이, 당신은 확실히 내가 늙었다 고 말할 수 있습니다!
gboffi

1
LC_ALL=C환경 에서 문자열 방출 프로그램을 실행할 수 없습니까 ?
Ángel

@ Ángel 아, 물론 나는 ...
gboffi

답변:


43

질문 locale:

locale decimal_point

현재 로케일 설정을 사용하여 소수점이 출력됩니다.

천 단위 구분 기호가 필요한 경우 :

locale thousands_sep

2
그리고 그와 적어도 locale는 GNU에서 libc, locale -k LC_NUMERICLC_NUMERIC 카테고리의 목록에 대한 모든 로케일 설정.
Stéphane Chazelas

3
@ Kusalananda는 POSIX 의 일부입니다 .
Stephen Kitt

3
@muru printf "%'f"printf지원 하는 구현을 위해 그렇게 할 것 %f입니다.
Stephen Kitt

2
@muru 소수 구분 기호를 출력 할 수 있는 유일한 내장 기능printf일부 셸 (예 :)이 dash국제화 된 출력을 지원하지 않습니다. 다른 답변에서 스테판 Chazelas가은에 설명 주석 이 POSIX에 의해 요구 아니라고,
gboffi

1
@StephenKitt 그렇습니다. 내가 전에 그것을 보지 못했다는 것이 이상합니다. 해당 사용이 locale지원되지 않는 시스템에 있다는 것은 도움 이되지 않습니다.
Kusalananda

6

이것이 zsh쉘 스크립트 $langinfo라면, zsh/langinfo모듈 에서 특별한 연관 배열을 사용할 수 있습니다 :

zmodload zsh/langinfo
radix=$langinfo[RADIXCHAR]

(표준에 대한지도는 것을 nl_langinfo(RADIXCHAR)참조 man nl_langinfo자세한 내용은 시스템에, $langinfo[THOUSEP]1000 명 단위 구분을 위해).

A의 bash스크립트 (도에서 작동합니다 zsh), 당신은 사용하여 별도의 프로세스를 분기없이 얻을 수 있어야 printf내장을 :

printf -v radix %.1f 1 && radix=${radix:1:1}

ksh93 쉘을 사용하여 사용자의 로케일 형식에서 C 로케일 형식으로 숫자를 변환하려면 다음과 같이하십시오.

$ locale title
German locale for Germany
$ x=1.123.456,78 ksh -c 'typeset -F x="$x"; LC_ALL=C; printf "%.23g\n" "$x"'
1123456.78

가장 일반적일까요? tmp=$(printf %.1f 0);tmp=${tmp#0};radix=${tmp%0}
gboffi

1
@gboffi, 그것은 모두 printf를 지원 %f하지는 않지만 국제화 된 일부 구현 에서 작동 합니다. %fPOSIX는 지원을 의무화하지 않습니다. printfdash예를 들어 항상 사용합니다.
스테판 Chazelas가

다시 dash국제화하지 ... 난 그냥 가장 일반적인 솔루션에 의존되도록 것을 ... 발견했습니다 locale decimal_point, 그렇지?
gboffi

아마 @gboffi. GNU awk는 POSIX 모드에있을 때 현재 로케일의 숫자를 해석 할 수도 있습니다 (천 단위 구분 기호는 처리하지 않음).
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.