Katakanlah saya punya skrip shell POSIX itu
- perlu dijalankan pada sistem / lingkungan berbeda yang tidak saya kendalikan, dan
- perlu menghapus pemisah desimal dari string yang dipancarkan oleh program yang menghormati pengaturan lokal.
Bagaimana saya bisa mendeteksi pemisah desimal dengan cara yang paling umum?
shell
posix
locale
floating-point
gboffi
sumber
sumber
tcsh
di ..., oh my, Anda pasti bisa mengatakan bahwa saya LAMA !!!LC_ALL=C
lingkungan?Jawaban:
Tanyakan
locale
:Ini akan menampilkan titik desimal menggunakan pengaturan lokal saat ini.
Jika Anda membutuhkan pemisah ribuan:
sumber
locale
dari GNUlibc
,locale -k LC_NUMERIC
untuk mendaftar semua pengaturan lokal di kategori LC_NUMERIC.printf "%'f"
akan melakukannya, untukprintf
implementasi yang mendukung%f
.printf
dan beberapa shell (misalnya,dash
) tidak mendukung output yang diinternasionalkan. Dalam jawaban lain Stéphane Chazelas menjelaskan, dalam komentar , bahwa itu tidak diperlukan oleh POSIXlocale
tidak mendukung penggunaannya.Jika itu
zsh
skrip shell, Anda dapat menggunakan$langinfo
array asosiatif khusus dalamzsh/langinfo
modul:(yang memetakan ke standar
nl_langinfo(RADIXCHAR)
, lihatman nl_langinfo
pada sistem Anda untuk detail;$langinfo[THOUSEP]
untuk seribu pemisah).Dalam sebuah
bash
skrip (juga bisa digunakanzsh
), Anda harus bisa mendapatkannya tanpa memalsukan proses terpisah menggunakanprintf
builtin:Untuk mengonversi angka dari format lokal pengguna ke format lokal C, dengan shell ksh93, Anda dapat melakukannya seperti:
sumber
tmp=$(printf %.1f 0);tmp=${tmp#0};radix=${tmp%0}
printf
implementasi internasional yang mendukung%f
, tetapi tidak semua.%f
dukungan tidak diamanatkan oleh POSIX. Theprintf
daridash
misalnya selalu menggunakan.
dash
tidak diinternasionalkan ... Saya baru saja menemukan bahwa ... jadi solusi yang paling umum adalah menggunakanlocale decimal_point
, bukan?awk
juga dapat menginterpretasikan angka-angka di lokal saat ini dengan ketika dalam mode POSIX (meskipun tidak menangani pemisah ribuan).