Powiedzmy, że mam taki skrypt powłoki POSIX
- musi działać na różnych systemach / środowiskach, których nie kontroluję, oraz
- musi usunąć separator dziesiętny z ciągu emitowanego przez program, który przestrzega ustawień regionalnych.
Jak mogę wykryć separator dziesiętny w najbardziej ogólny sposób?
shell
posix
locale
floating-point
gboffi
źródło
źródło
tcsh
w ... och, na pewno można powiedzieć, że jestem stary !!!LC_ALL=C
środowisku?Odpowiedzi:
Zapytaj
locale
:Spowoduje to wyświetlenie przecinka dziesiętnego przy użyciu bieżących ustawień regionalnych.
Jeśli potrzebujesz separatora tysięcy:
źródło
locale
GNUlibc
,locale -k LC_NUMERIC
aby wyświetlić wszystkie ustawienia regionalne w kategorii LC_NUMERIC.printf "%'f"
zrobiłby to dlaprintf
implementacji, które obsługują%f
.printf
niektóre powłoki (np.dash
) nie obsługują wyjścia zinternacjonalizowanego . W innej odpowiedzi Stéphane Chazelas wyjaśnił w komentarzu , że POSIX nie wymaga tegolocale
nie jest obsługiwane.Jeśli jest to
zsh
skrypt powłoki, możesz użyć$langinfo
specjalnej tablicy asocjacyjnej wzsh/langinfo
module:(to odwzorowuje do standardu
nl_langinfo(RADIXCHAR)
, zobacz szczegółyman nl_langinfo
w twoim systemie;$langinfo[THOUSEP]
separator tysięcy).W
bash
skrypcie (również działałbyzsh
) powinieneś być w stanie go uzyskać bez tworzenia osobnego procesu za pomocąprintf
wbudowanego:Aby przekonwertować liczbę z formatu ustawień regionalnych użytkownika na format ustawień regionalnych C, za pomocą powłoki ksh93 możesz to zrobić w następujący sposób:
źródło
tmp=$(printf %.1f 0);tmp=${tmp#0};radix=${tmp%0}
printf
implementacjach, które obsługują%f
, ale nie wszystkie.%f
obsługa nie jest wymagana przez POSIX.printf
Nadash
przykład zawsze używa.
dash
nie zinternacjonalizowany ... Właśnie okazało się, że ... tak najbardziej ogólne rozwiązanie jest uciekania sięlocale decimal_point
, prawda?awk
może również interpretować liczby w bieżącym języku z trybem POSIX (choć nie obsługuje separatora tysięcy).