Preencher um número com um zero

5

Estou tentando preencher zero para um número

a=010
printf "%04d" $a
0008

Eu preciso da "saída" como "0010" está convertendo o valor.

e até tentou com o typeset

a=010
typeset -RZ2 a
echo $a

quando eu uso o mesmo no meu script, recebi o seguinte erro:

Invalid -R option
    
por user43067 26.08.2013 / 09:05

4 respostas

13

Não coloque um "0" no início do número - ele trata o número na base octal . Simplesmente atribua o número decimal.

a=10    
printf "%04d" $a    
0010    

Se você estiver lendo os números em algum outro lugar, considere remover os 0s no começo da seguinte forma:

a=0010    
b=$(echo $a | sed 's/^0*//')    
printf "%04d" $a    
0008
printf "%04d" $b    
0010    
    
por 26.08.2013 / 09:13
10

Em POSIX,

Você pode descartar o caractere 0 da esquerda com o seguinte:

a=00010
while [ "$a" != "${a#0}" ] ;do a=${a#0};done
printf "%08d" $a
00000010

Como isso não bifurca uma nova sessão de comando, isso pode ser mais rápido do que usar sed .

Em

Você pode forçar a interpretação decimal com a seguinte sintaxe:

a=000010
printf "%08d" $((10#$a))
00000010

Isso pode ser útil para conversões:

a="0a"
printf "%04d" $((16#$a))
0010

a="00001010"
printf "%04d" $((2#$a))
0010

a="00012"
printf "%04d" $((8#$a))
0010

a="0020"
printf "%04d" $((5#$a))
0010

a="0013"
printf "%04d" $((7#$a))
0010

e assim por diante ...

a="zz"
printf "%04d" $((36#$a))
1295
    
por 26.08.2013 / 09:17
4

typeset -Z4 a funcionará com zsh ou ksh .

Quando interpretado como um número, em POSIX sh e printf, se houver um zero à esquerda, ele é interpretado como um número octal. Então, você precisa remover os 0 s primeiro:

printf '%04d\n' "${a#"${a%%[!0]*}"}"

Ou você pode usar awk que não tem esse problema:

awk 'BEGIN{printf "%04d\n", ARGV[1]}' "$a"
    
por 26.08.2013 / 11:46
4

Você pode fazer isso usando um especificador de conversão diferente, por exemplo, o especificador "f". Do manual do printf :

f, F

The double argument is rounded and converted to decimal notation in the style [-]ddd.ddd, where the number of digits after the decimal-point character is equal to the precision specification. If the precision is missing, it is taken as 6; if the precision is explicitly zero, no decimal-point character appears. If a decimal point appears, at least one digit appears before it.

Mas, na verdade, não queremos uma representação de ponto flutuante do seu número, portanto, devemos especificar uma precisão de zero. Isso deve ser feito:

a=010
printf "%04.0f" $a

Estou assumindo que você está usando o Linux, mas isso também deve funcionar com outros tipos de Unix.

    
por 26.08.2013 / 16:28