2009-12-14 16 views
13

Come faccio a controllare una variabile int ($ inputNo) per vedere se sono presenti 2 o più cifre decimali?Assicurati che la variabile int sia lunga 2 cifre, altrimenti aggiungi 0 in avanti per renderlo lungo 2 cifre

Esempio:

inputNo="5" 

deve essere cambiata in: 05

inputNo="102" 

devono essere lasciati soli: 102

Avevo pensato di usare wc e if dichiarazioni, ma non lo fa wc -m sembra dare i caratteri reali passati in wc, come wc vedere sempre ms per dare +1 ai caratteri che sono dati.

Ma non so come aggiungere uno 0 davanti al numero di ingresso corrente.

risposta

32

È possibile utilizzare la bash-incorporato printf con l'opzione -v di scrivere ad una variabile piuttosto che stamparlo su standard output:

pax> inputNo=5 ; printf -v inputNo "%02d" $inputNo ; echo $inputNo 
05 
pax> inputNo=102 ; printf -v inputNo "%02d" $inputNo ; echo $inputNo 
102 

Dovrai assicurarti che sia numerico prima altrimenti la conversione fallirà. Se si vuole essere in grado di pad qualsiasi stringa fuori per due o più caratteri, è anche possibile utilizzare:

while [[ ${#inputNo} -lt 2 ]] ; do 
    inputNo="0${inputNo}" 
done 

che è fondamentalmente un ciclo while, che viene anteposta la stringa con "0" fino a quando la lunghezza è maggiore uguale o uguale a due.

Si noti che questo può essere fatto anche in bash anteponendo il numero con due zeri poi semplicemente ottenere gli ultimi due caratteri della stringa, controllando prima che non è già, almeno le dimensioni desiderate:

if [[ ${#inputNo} -lt 2 ]] ; then 
    inputNo="00${inputNo}" 
    inputNo="${inputNo: -2}" 
fi 

La differenza probabilmente non è troppo grande per un numero a due cifre, ma potresti trovare che quest'ultima soluzione è migliore se hai bisogno di larghezze maggiori.


Se stai usando una shell altro di bash (improbabile, in base alle tag), avrete bisogno di trovare gli equivalenti, o tornare a utilizzare processi esterni per fare il lavoro, qualcosa di simile :

while [[ $(echo -n ${inputNo} | wc -c) -lt 2 ]] ; do 
    inputNo="0${inputNo}" 
done 

Questo fa sostanzialmente quello che stavi pensando fuori nella tua domanda, ma noti l'uso del -n nel comando echo per evitare che il newline finale (che è stato quasi certamente causando il vostro off-by-one errore).

Ma, come detto, questa è una posizione di ripiego. Se stai utilizzando bash, i miei suggerimenti precedenti sono probabilmente i migliori.

+0

Grazie! Funziona alla grande. – Mint

+0

Nessun bisogno di processi esterni nel caso generale: 'while test" $ {# inputNo} "-lt 2; do inputNo = "0 $ inputNo"; done' (* [[* modificato in * test * con aggiunta di quoting per renderlo compatibile con più shell). –

+0

Nessun bisogno di estensioni bash ($ {# ...}): 'caso $ inputNo in [0-9]) inputNo =" 0 $ inputNo ";; *) ;; esac'. – Idelic

1

È possibile utilizzare http://bash-hackers.org/wiki/doku.php/commands/builtin/printf, un esempio da lì:

the_mac="0:13:ce:7:7a:ad" 

# lowercase hex digits 
the_mac="$(printf "%02x:%02x:%02x:%02x:%02x:%02x" 0x${the_mac//:/ 0x})" 

# or the uppercase-digits variant 
the_mac="$(printf "%02X:%02X:%02X:%02X:%02X:%02X" 0x${the_mac//:/ 0x})" 
+0

Grazie per il link, mi piace sempre leggere come funziona una funzione e che cosa può fare tutto. – Mint

6

Per imbottitura generico se la stringa è numerica o meno

Nessuna necessità di tubazioni echo in wc o utilizzando un ciclo while.

In Bash, è possibile ottenere la lunghezza di una stringa come questa: ${#inputNo}.

E dal momento che si può fare sottostringhe, si può fare questo, invece:

if [[ ${#input} < 2 ]] 
then 
    inputNo="00${inputNo}" 
    inputNo="${inputNo: -2}" 
fi 
Problemi correlati