Geçerli ondalık ayırıcı hangisidir?


29

Diyelim ki bir POSIX kabuk betiğim var

  1. Kontrol etmediğim farklı sistemlerde / ortamlarda çalışmam gerekiyor ve
  2. ondalık ayırıcıyı, yerel ayarlara uygun bir program tarafından yayımlanan bir dizeden kaldırmanız gerekir.

Ondalık ayırıcıyı en genel şekilde nasıl saptayabilirim?


Ne tür bir senaryo? Nerede çalışıyor? Lütfen sorunuzu güncelleyin, böylece cevaplanabilir.
X Tian

@XTian Unix / Linux sisteminde çalışan genel bir kabuk betiği. Question Kasten en genel şekilde soruyu sordum, çünkü sorumun son satırında belirttiğim gibi, en genel cevapla ilgileniyorum.
gboffi

1
@ StéphaneChazelas Bir POSIX betiği! Dürüst, ben eskiden kullandığımı unuttum tcsh..., oh benim, kesinlikle eski olduğumu söyleyebilirsin !!!
gboffi

1
Yayılan programı bir LC_ALL=Cortam altında çalıştıramaz mısınız?
Ángel

@ Ángel Ah evet, elbette yapabilirim ...
gboffi

Yanıtlar:


43

Sormak locale:

locale decimal_point

Bu, geçerli yerel ayarları kullanarak ondalık basamağı çıkarır.

Binlerce ayırıcıya ihtiyacınız varsa:

locale thousands_sep

2
Ve sahip en az localeGNU libc, locale -k LC_NUMERICLC_NUMERIC kategorisinde listeye tüm yerel ayarları.
Stéphane Chazelas

3
Bir 's parçası @Kusalananda POSIX'e .
Stephen Kitt

3
@muru printf "%'f", bunu printfdestekleyen uygulamalar için yapardı %f.
Stephen Kitt

2
@muru Ondalık ayırıcı çıktısı alabildiğim tek yerleşik yapı , printfbazı kabukların (örn. dash) uluslararası çıktıları desteklememesidir. Bir başka cevapta Stéphane Chazelas, bir yorumda POSIX tarafından gerekli olmadığını açıkladı
gboffi

1
@StephenKitt Öyleyse öyle. Daha önce karşılaşmamam çok garip. Bu kullanımı localedesteklenmeyen bir sistemde olduğumu yardımcı olmuyor.
Kusalananda

6

Bu bir zshkabuk betiği $langinfoise, zsh/langinfomodüldeki özel ilişkisel diziyi kullanabilirsiniz :

zmodload zsh/langinfo
radix=$langinfo[RADIXCHAR]

(bu standartla eşleşir nl_langinfo(RADIXCHAR), man nl_langinfoayrıntılar için sisteminize bakın; $langinfo[THOUSEP]bin ayırıcı için).

Bir bashkomut dosyasında (ayrıca çalışacaktır zsh), yerleşimi kullanarak ayrı bir işlem yapmadan elde edebilmeniz gerekir printf:

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

Bir sayıyı kullanıcının yerel formatından C yerel formatına dönüştürmek için ksh93 kabuğu ile aşağıdakileri yapabilirsiniz:

$ 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

En genel, olabilir mi? tmp=$(printf %.1f 0);tmp=${tmp#0};radix=${tmp%0}
gboffi

1
@gboffi, bu , hepsini printfdestekleyen %f, ancak hepsini desteklemeyen bazı uluslararasılaştırılmış uygulamalarda çalışacaktır . %fPOSIX tarafından destek zorunlu değildir. printfArasında dashörneğin her zaman kullanır.
Stéphane Chazelas

re dashuluslararasılaştırıldı değil ... Sadece en genel çözüm başvurmadan, böylelikle ... buldum locale decimal_point, değil mi?
gboffi

Muhtemelen @gboffi. GNU awk, geçerli yerel ayardaki sayıları POSIX modundayken de yorumlayabilir (bununla birlikte bin ayırıcıyı işlemez).
Stéphane Chazelas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.