Milhares de separador em printf em zsh

4

Eu tenho tentado definir um separador de milhares em printf por um tempo agora e descobri que o zsh tem alguns problemas com ele.

No bash eu posso usar algo como:

$ printf "%'d\n" 1234567890
1,234,567,890

mas no zsh não funcionará:

$ printf "%'d\n" 1234567890
printf: %': invalid directive

Acabei de descobrir que o coreutils printf fará tudo certo:

$/usr/bin/printf "%'d\n" 1234567890
1,234,567,890

Como posso usar o separador de milhares em zsh?

$ zsh --version
zsh 5.0.2 (x86_64-pc-linux-gnu) 
    
por Patryk 02.07.2014 / 11:27

2 respostas

10

Atualização: a partir de zsh v. 5.1 , o printf builtin suporta o agrupamento de milhares por meio de ' , como bash / coreutils printf (veja também a discussão aqui ).

O separador de milhar é uma extensão GNU que o zsh não suporta e tem seu próprio printf embutido que você acaba usando em seu lugar. Conforme mencionado na postagem vinculada, você pode obter o separador de milhares dependente de localidade com:

zmodload zsh/langinfo
echo $langinfo[THOUSEP]

Se você precisa usar especificamente e exclusivamente o zsh, você pode usá-lo com sed.

Provavelmente, será mais fácil usar o não integrado printf do GNU coreutils em vez disso, o que permitirá a opção de separador de milhares se o seu sistema:

$ command printf "%'d\n" 1234567890
1,234,567,890

command printf diz ao shell não para usar um builtin ou alias, mas para procurar o comando em $PATH .

    
por 02.07.2014 / 11:41
3

Para complementar a resposta de Michael , você poderia fazer a formatação mil-sep com os operadores zsh com :

var=1234567

zmodload zsh/langinfo
setopt extendedglob
echo $var[1,(l=-($#var-1)/3*3)-1]${var[l,l?-1:l]//(#m)???/$langinfo[THOUSEP]$MATCH}
    
por 02.07.2014 / 17:03