2012-10-11 34 views
9

utilizo la localización italiana de Cygwin, y por lo tanto mi comando printf utiliza comas para separar los flotadores, y no va a entender flotadores separados por puntos¿Cómo cambio el separador decimal en el comando printf en bash?

$ printf "%f" 3.1415 
-bash: printf: 3.1415: invalid number 
0,000000 

$ printf "%f" 3,1415 
3,141500 

Esto da lugar a varios problemas debido, básicamente, todo lo demás usa un punto para separar dígitos decimales

¿Cómo puedo cambiar el separador decimal de coma a punto?

Respuesta

12

Existen varias variables locales que controlan la localización de cygwin (o de cualquier shell de bash, para el caso). Puede verlos junto con su valor utilizando el comando locale. Debería ver algo como esto:

$ locale 
LANG=it_IT.UTF-8 
LC_CTYPE="it_IT.UTF-8" 
LC_NUMERIC="it_IT.UTF-8" 
LC_TIME="it_IT.UTF-8" 
LC_COLLATE="it_IT.UTF-8" 
LC_MONETARY="it_IT.UTF-8" 
LC_MESSAGES="it_IT.UTF-8" 
LC_ALL= 

Se puede ver los posibles valores de las variables mediante el uso de locale -va. Todos están formateados como _.UTF-8. UTF-8 es opcional. Para cambiar al estilo de separación de flotación de América del Norte simplemente configure LC_NUMERIC a su valor estadounidense.

$ export LC_NUMERIC="en_US.UTF-8" 

simplemente definiendo la variable LC_NUMERIC como si fuera una variable regular no va a funcionar, es necesario utilizar el comando de exportación.

Usted puede poner esto en la cabecera de las secuencias de comandos, o puede hacerlo permanente añadiéndolo a su ~/.bashrc o su ~/.bash_profile

la esperanza que esto era útil!

+1

Se podía establecer 'LC_NUMERIC =" en_US.UTF- 8 "', pero eso no cambia la configuración en todo el sistema, pero en el alcance de la secuencia de comandos o el shell se realiza la configuración. Además, puede cambiar la configuración regional solo para el comando por 'LC_NUMERIC =" en_US. UTF-8 "printf"% f "3.1415'. – jarno

+1

Consulte la respuesta a continuación para obtener una solución mejor (IMO) que funciona independientemente de las configuraciones regionales que haya instalado. – mav

6

Si usted no quiere meterse con la configuración del sistema, se puede respetar el entorno local, pero asegúrese de que su script usa puntos para los decimales con:

$ printf "%f" 3.5 
-bash: printf: 3,5: invalid number 
0.000000 

$ LANG=C printf "%f" 3.5 
3.500000 
+1

Hay casos donde 'LANG = C' no es suficiente,' LC_NUMERIC = C' funciona mejor. –

Cuestiones relacionadas