2009-12-14 23 views
13

¿Cómo verifico una variable int ($ inputNo) para ver si tiene 2 o más dígitos decimales?Asegúrese de que la variable int tenga 2 dígitos de longitud, de lo contrario agregue 0 al frente para que tenga 2 dígitos

Ejemplo:

inputNo="5" 

se debe cambiar a: 05

inputNo="102" 

deben ser dejados solos: 102

Pensé en usar wc y if declaraciones, pero no lo hace wc -m parece dar los caracteres reales pasados ​​a wc, como wc siempre ver ms para dar +1 a los caracteres que se le dan.

Pero no sé cómo agregar un 0 al frente del número de entrada actual.

Respuesta

32

Puede utilizar el bash incorporado printf con la opción -v para escribirlo en una variable en lugar de imprimir en la salida estándar:

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

Primero querrá asegurarse de que sea numérica, de lo contrario la conversión fallará. Si usted quiere ser capaz de almohadilla cualquier cadena a dos o más caracteres, también se puede utilizar:

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

que es básicamente un bucle while que prefija la cadena con "0" hasta que la longitud es mayor que o igual a dos.

Tenga en cuenta que esto también puede hacerse en bash anteponiendo el número con dos ceros a continuación, simplemente conseguir los dos últimos caracteres de esa cadena, comprobar primero que no está ya al menos el tamaño deseado:

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

La diferencia probablemente no sea demasiado grande para un número de dos dígitos, pero puede encontrar que la última solución es mejor si necesita anchos más grandes.


Si estás usando una concha otra de bash (poco probable, basado en sus etiquetas), tendrá que encontrar los equivalentes, o volver a usar procesos externos para hacer el trabajo, algo así como :

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

Esto hace básicamente lo que estabas pensando fuera de su pregunta, pero tenga en cuenta el uso de -n en el comando echo para evitar el salto de línea final (que fue casi con certeza la causa de su off-by-one error).

Pero, como se dijo, esta es una posición de retroceso. Si está usando bash, las primeras sugerencias mías son probablemente las mejores.

+0

¡Gracias! Funciona genial. – Mint

+0

No hay necesidad de procesos externos en el caso general: 'while test" $ {# inputNo} "-lt 2; hacer inputNo = "0 $ inputNo"; done' (* [[* cambió a * prueba * con un presupuesto añadido para que sea compatible con más shells). –

+0

No hay necesidad de extensiones bash ($ {# ...}) tampoco: 'case $ inputNo en [0-9]) inputNo =" 0 $ inputNo ";;) ;; esac'. – Idelic

1

Puede utilizar http://bash-hackers.org/wiki/doku.php/commands/builtin/printf, un ejemplo de allí:

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

Gracias por el enlace, siempre me gusta leer cómo funciona una función y lo que puede hacer todo. – Mint

6

para el relleno de propósito general si la cadena es numérico o no

No hay necesidad de tuberías de echo en wc o el uso de un bucle while.

En Bash, puede obtener la longitud de una cadena como esta: ${#inputNo}.

Y ya que se puede hacer subseries, se puede hacer esto en su lugar:

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