Digamos que tengo un script de shell POSIX que
- necesita ejecutarse en diferentes sistemas / entornos que no controlo, y
- necesita eliminar el separador decimal de una cadena emitida por un programa que respeta la configuración regional.
¿Cómo puedo detectar el separador decimal de la manera más general?
shell
posix
locale
floating-point
gboffi
fuente
fuente
tcsh
en ... ¡oh, definitivamente puedes decir que soy VIEJO!LC_ALL=C
entorno?Respuestas:
pregunte
locale
:Esto generará el punto decimal utilizando la configuración regional actual.
Si necesita el separador de miles:
fuente
locale
de GNUlibc
,locale -k LC_NUMERIC
para enumerar todas las configuraciones locales en la categoría LC_NUMERIC.printf "%'f"
lo haría, paraprintf
implementaciones que admitan%f
.printf
y algunos shell (por ejemplo,dash
) no soportan salida internacionalizado. En otra respuesta, Stéphane Chazelas explicó, en un comentario , que POSIX no lo requierelocale
no se admite ese uso .Si se trata de un
zsh
script de shell, puede usar la$langinfo
matriz asociativa especial en elzsh/langinfo
módulo:(que se asigna al estándar
nl_langinfo(RADIXCHAR)
, consulteman nl_langinfo
en su sistema para más detalles;$langinfo[THOUSEP]
para el separador de miles).En un
bash
script (también funcionaríazsh
), debería poder obtenerlo sin bifurcar un proceso separado usando elprintf
incorporado:Para convertir un número del formato de configuración regional del usuario al formato de configuración regional C, con el shell ksh93, puede hacerlo de la siguiente manera:
fuente
tmp=$(printf %.1f 0);tmp=${tmp#0};radix=${tmp%0}
printf
implementaciones internacionalizadas que admiten%f
, pero no en todas.%f
el soporte no es obligatorio por POSIX. Elprintf
dedash
por ejemplo siempre usa.
dash
no estamos internacionalizados ... Acabo de descubrir que ... así que la solución más general es recurrirlocale decimal_point
, ¿no?awk
también puede interpretar números en el entorno local actual cuando está en modo POSIX (aunque no maneja el separador de miles).