Qual è l'attuale separatore decimale?


29

Dire che ho uno script shell POSIX che

  1. deve funzionare su diversi sistemi / ambienti che non controllo, e
  2. deve rimuovere il separatore decimale da una stringa emessa da un programma che rispetta le impostazioni locali.

Come posso rilevare il separatore decimale nel modo più generale?


Che tipo di sceneggiatura? Dove sta correndo? Ti preghiamo di aggiornare la tua domanda, in modo che possa ricevere una risposta.
X Tian,

@XTian Uno script di shell generico, in esecuzione su un sistema Unix / Linux. ֎ Ho deliberatamente posto la domanda nel modo più generale perché sono interessato alla risposta più generale, come ho specificato nell'ultima riga della mia domanda.
gboffi,

1
@ StéphaneChazelas Uno script POSIX! Onestamente, ho dimenticato che usavo tcshin ... oh mio, puoi sicuramente dire che sono VECCHIO !!!
gboffi,

1
Non è possibile eseguire il programma emesso da stringa in un LC_ALL=Cambiente?
Ángel,

Risposte:


43

Chiedi locale:

locale decimal_point

Questo produrrà il punto decimale usando le impostazioni locali correnti.

Se hai bisogno del separatore delle migliaia:

locale thousands_sep

2
E almeno con il localeda GNU libc, locale -k LC_NUMERICper elencare tutte le impostazioni locali nella categoria LC_NUMERIC.
Stéphane Chazelas,

3
@Kusalananda fa parte di POSIX .
Stephen Kitt,

3
@muru printf "%'f"lo farebbe, per printfimplementazioni che supportano %f.
Stephen Kitt,

2
@muru L'unico built-in che conosco, che può generare un separatore decimale, è printfe alcune shell (ad es. dash) non supportano output internazionalizzati. In un'altra risposta Stéphane Chazelas ha spiegato, in un commento , che non è richiesto da POSIX
gboffi,

1
@StephenKitt Così è. È strano che non l'abbia mai incontrato prima. Non aiuta il fatto che io sia su un sistema in cui l'uso di localenon è supportato.
Kusalananda

6

Se quello è uno zshscript di shell, puoi usare l' $langinfoarray associativo speciale nel zsh/langinfomodulo:

zmodload zsh/langinfo
radix=$langinfo[RADIXCHAR]

(che è mappato allo standard nl_langinfo(RADIXCHAR), vedi man nl_langinfosul tuo sistema per i dettagli; $langinfo[THOUSEP]per i mille separatori).

In uno bashscript (funzionerebbe anche in zsh), dovresti essere in grado di ottenerlo senza creare un processo separato usando l' printfintegrato:

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

Per convertire un numero dal formato locale dell'utente al formato locale C, con la shell ksh93, è possibile farlo come segue:

$ 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

Più generico, potrebbe essere? tmp=$(printf %.1f 0);tmp=${tmp#0};radix=${tmp%0}
gboffi,

1
@gboffi, funzionerebbe in alcune printfimplementazioni internazionalizzate che supportano %f, ma non tutte. %fil supporto non è obbligatorio da POSIX. Il printfdi dashper esempio utilizza sempre.
Stéphane Chazelas

ri dashnon internazionalizzato ... ho appena scoperto che ... così la soluzione più generale ricorrere a locale decimal_point, non è vero?
gboffi,

@gboffi, probabilmente. GNU awkpuò anche interpretare i numeri nella locale corrente con quando in modalità POSIX (tuttavia non gestisce il separatore dei mille).
Stéphane Chazelas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.