Digamos que eu tenha um script de shell POSIX que
- precisa ser executado em diferentes sistemas / ambientes que eu não controle e
- precisa remover o separador decimal de uma string emitida por um programa que respeite as configurações de localidade.
Como posso detectar o separador decimal da maneira mais geral?
shell
posix
locale
floating-point
gboffi
fonte
fonte
tcsh
em ... oh meu Deus, você definitivamente pode dizer que eu sou VELHO !!!LC_ALL=C
ambiente?Respostas:
Pergunte
locale
:Isso produzirá o ponto decimal usando as configurações atuais de localidade.
Se você precisar do separador de milhares:
fonte
locale
do GNUlibc
,locale -k LC_NUMERIC
para listar todas as configurações de localidade na categoria LC_NUMERIC.printf "%'f"
faria isso paraprintf
implementações suportadas%f
.printf
e alguns shell (por exemplo,dash
) não suportam saída internacionalizada. Em outra resposta, Stéphane Chazelas explicou, em um comentário , que não é exigido pelo POSIXlocale
não seja suportado.Se esse é um
zsh
script de shell, você pode usar a$langinfo
matriz associativa especial nozsh/langinfo
módulo:(que mapeia para o padrão
nl_langinfo(RADIXCHAR)
, consulteman nl_langinfo
em seu sistema para obter detalhes;$langinfo[THOUSEP]
para o separador de milhar).Em um
bash
script (também funcionariazsh
), você deve conseguir obtê-lo sem forjar um processo separado usando oprintf
builtin:Para converter um número do formato de localidade do usuário para o formato de localidade C, com o shell ksh93, você pode fazer o seguinte:
fonte
tmp=$(printf %.1f 0);tmp=${tmp#0};radix=${tmp%0}
printf
implementações internacionalizadas que suportam%f
, mas não em todas.%f
O suporte não é obrigatório pelo POSIX. Oprintf
de,dash
por exemplo, sempre usa.
dash
não internacionalizada ... Eu apenas encontrei que ... então a solução mais geral é recorrer alocale decimal_point
, não é?awk
também pode interpretar números na localidade atual com o modo POSIX (embora não lide com o separador de milhar).