La siguiente función da como resultado "10.000". Donde vivo esto significa "diez mil".

format!("{:.3}", 10.0);

Me gustaría que la salida sea "10,000".

4
r03 15 jun. 2017 a las 23:01

3 respuestas

La mejor respuesta

Como la biblioteca estándar no tiene esta funcionalidad (localización del formato de número), puede reemplazar el punto con una coma:

fn main() {
    println!("{}", format!("{:.3}", 10.0).replacen(".", ",", 1));
}

Hay otras formas de hacerlo, pero esta es probablemente la solución más sencilla.

4
ljedrz 15 jun. 2017 a las 21:12

No hay soporte para la internacionalización (i18n) o la localización (l10n) en la biblioteca estándar Rust.


Hay varias razones, sin un orden particular:

  1. una salida dependiente de la configuración regional debe ser una elección consciente, no un valor predeterminado,
  2. i18n y l10n son mucho más complicados que solo formatear números,
  3. La Rust std apunta a ser pequeña.

La maquinaria format! se utilizará para escribir archivos JSON o XML. Realmente NO desea terminar con un archivo con un formato diferente dependiendo de la configuración regional de la máquina que lo codificó. Es una receta para el desastre.

La detección de la configuración regional en tiempo de ejecución también es una optimización poco amigable. De repente, no puede calcular previamente las cosas en tiempo de compilación (incluso parcialmente), ni siquiera puede saber qué tamaño de búfer asignar en tiempo de compilación.

Y esto se relaciona con una dudosa utilidad. Las fechas y los números son posiblemente importantes, sin embargo, esta guerra de formato estadounidense vs inglés es, en última instancia, una gota en el océano. Un estudiante de gramática francesa ciertamente apreciará que el número esté formateado en el formato típico francés ... pero no le servirá de nada si el texto que lo rodea está en inglés (los franceses somos notoriamente malos en la enseñanza / aprendizaje de idiomas extranjeros). La configuración regional debe influir en la selección del idioma, el orden de clasificación, etc., simplemente cambiar el formato de los números no tiene sentido, todo debería cambiar, y esto requiere un soporte mucho más serio (verifique gettext para una biblioteca en C que proporciona una buena base ).

Basar la detección de la configuración regional en la configuración regional del host, y ser global para todo el proceso, también es una opción arquitectónica dudosa muy en esta era de servidores web multiproceso. Imagínese si Facebook se sirvió en sueco en Europa solo porque su centro de datos está funcionando allí.

Finalmente, todo este soporte de idioma / fecha / ... requiere una cantidad enorme de datos. ICU tiene varias docenas (¿o son cientos?) de MB de dichos datos incrustados en su interior. Esto haría explotar el tamaño de std, y lo haría completamente inadecuado para el desarrollo integrado; que probablemente no se preocupe por esto de todos modos.

Por supuesto, podría reducir esto significativamente si solo elige admitir un puñado de idiomas ... lo cual es otro argumento más para poner esto fuera de la biblioteca estándar.

4
Matthieu M. 16 jun. 2017 a las 07:24

Este no es el rol de la macro format!. Esta opción debe ser manejada por Rust. Desafortunadamente, mi búsqueda me llevó a la conclusión de que Rust no maneja la configuración regional (¿todavía?).

Hay una biblioteca rust-locale, pero todavía están en alfa.

1
Stargateur 15 jun. 2017 a las 20:25