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

tcshen ... ¡oh, definitivamente puedes decir que soy VIEJO!LC_ALL=Centorno?Respuestas:
pregunte
locale:Esto generará el punto decimal utilizando la configuración regional actual.
Si necesita el separador de miles:
fuente
localede GNUlibc,locale -k LC_NUMERICpara enumerar todas las configuraciones locales en la categoría LC_NUMERIC.printf "%'f"lo haría, paraprintfimplementaciones que admitan%f.printfy algunos shell (por ejemplo,dash) no soportan salida internacionalizado. En otra respuesta, Stéphane Chazelas explicó, en un comentario , que POSIX no lo requierelocaleno se admite ese uso .Si se trata de un
zshscript de shell, puede usar la$langinfomatriz asociativa especial en elzsh/langinfomódulo:(que se asigna al estándar
nl_langinfo(RADIXCHAR), consulteman nl_langinfoen su sistema para más detalles;$langinfo[THOUSEP]para el separador de miles).En un
bashscript (también funcionaríazsh), debería poder obtenerlo sin bifurcar un proceso separado usando elprintfincorporado: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}printfimplementaciones internacionalizadas que admiten%f, pero no en todas.%fel soporte no es obligatorio por POSIX. Elprintfdedashpor ejemplo siempre usa.dashno estamos internacionalizados ... Acabo de descubrir que ... así que la solución más general es recurrirlocale decimal_point, ¿no?awktambién puede interpretar números en el entorno local actual cuando está en modo POSIX (aunque no maneja el separador de miles).