Tres lustros he vivido ajeno a la existencia de una reforma ortográfica de la RAE relacionada con la escritura de números, y que trataba de acercar la ortografía a las prácticas recomendadas del mundo científico. Entiendo que mi caso no es aislado sino el de la gran mayoría, y no obstante este cambio de criterio debe considerarse al menos en la comunidad técnica y científica.
En 2009 se publicó es estándar ISO/IEC 80000-1, sobre apuntes generales para medidas y unidades, que daba indicaciones sobre cómo deben representarse los números siguiendo un criterio común internacional.
La RAE recogió estas normas y las incluyó en la “Ortografía de la lengua española” de 2010 estas normas en los apartados 2.2.1.1. “Los números enteros y el separador de millares” y 2.2.1.2. “Los números decimales y el separador decimal“. Fundéu resume estas normas en su artículo “decimales: punto y coma son signos válidos” de 2025. Existe incluso un informe de la Abogacía del Estado de 2017 tratando el impacto legal de esta notación.
Las normas ortográficas promulgadas se resumen a continuación:
- Son válidos como separador de decimales tanto el punto (.) como la coma (.), siendo el primero el recomendado.
- La parte entera de un número agrupa los números de 3 en 3.
- Ninguno de estos dos símbolos mencionados (punto y coma) se puede emplear como separador de millares; en su lugar, se debe emplear el espacio fino, distinto del espacio estándar para separar palabras.
- Los números de 4 cifras no deben llevar separador de millares.
No ha habido más reformas de la Ortografía desde 2010, a pesar de que sí que se publicó la nueva versión ISO/IEC 80000-1:2020, publicado en España por AENOR como la UNE-EN ISO IEC 80000-1:2023.
Consideraciones sobre la norma ortográfica
Por un lado, veo lógico y positivo tratar de eliminar la ambigüedad existente entre separadores decimales, y que tiene lugar incluso entre los distintos países de habla hispana. Quien trabaje con lenguajes de programación o emplee software en inglés, se encontrará con que debe estar pensando en escribir números decimales de una manera y mostrarlos de otra cuando van dirigidas a un público de habla hispana. Considero positivo el querer unificar criteros o dar simplemente la posibilidad de hacerlo.
Por otro lado, el emplear como separador de millares un espacio corto, distinto del espacio estándar, plantea dificultades no trivialmente salvables. Pocos usuarios saben cómo escribir un espacio corto, y muchos estarán tentados a escribir un espacio estándar, añadiendo un ambigüedad que no existía antes al introducir la duda de si la intención era escribir varios números seguidos o si solo se está empleando un separador de millares.
A pesar de que la recomendación de la RAE tiene más de 15 años de existencia, si se echa un vistazo a los medios y publicaciones hispanos contemporáneos y a las herramientas de software se comprobará que el criterio seguido es el tradicional y se aferra al uso de la coma para los decimales y el punto como separados de millares. Con lo cual se concluye que la norma no ha parecido tener una acogida popular, más allá de nichos más técnicos donde sí se sigue (por ejemplo, los informes de la AEMET).
El uso del espacio corto para los millares también es prescriptivo en Alemania o el sistema internacional (SI) de unidades, con las mismas consecuencias: poca aceptación y complicaciones técnicas.
Con ánimo de facilitar a quien trate de seguir la norma ortográfica de la RAE de 2010, se dedica el apartado a continuación.
Cómo configurar un sistema de acuerdo a la ortografía de números de la RAE 2010
En este apartado se explica a nivel técnico cómo añadir la separación de espacios cortos por plataforma, tal y como recomiendan la ISO 80000-1, la ortografía de la RAE desde 2010.
El caracter Unicode u+202F se corresponde con el separador de millares de acuerdo al Sistema Internacional; se conoce en español como el espacio fino duro o sin ruptura, ya que no permite que justo después de él haya un salto de línea. El caracter u+2029 (espacio fino, en inglés thin space) es visualmente similar al caracter u+2029, pero carece de la indicación de evitar que detrás de él haya salto de línea. Se recomienda el uso de u+202F ya que es el indicado en los estándares.
Windows
Para añadir el separador decimal, es suficiente con emplear el punto (.).
Para anadir el separador de millares, se complica: mientras se escribe un texto (por ejemplo, en el procesador de textos Microsoft Word o en un navegador) hay que introducir el código 202F seguido de Alt + X. En caso de que no sea un inicio de línea o palabra, es necesario añadir un espacio estándar temporal antes de empezar a escribir el código, o si no considerará también los valores introducidos antes del código 202F.
Alternativamente, se pueden emplear funcionalidades de inserción de símbolos, como la aplicación “Mapa de caracteres” nativa de Windows o la función de “Insertar símbolo” en aplicaciones como Word, y buscar el caracter Unicode 202F.
También se podrían usar macros en Word o scripts de AutoHotkey.
En cuanto a la visualización, se puede configurar Windows 11 para que siga este convenio. Para ello, hay que ir a Panel de Control > Hora e idioma > Formato regional > Números. En esta pantalla, modificar:
- Símbolo de decimales: . (punto)
- Separador agrupador de dígito: espacio
- Agrupador de dígito: 123.456.789 (escoger el que agrupa de 3 en 3)
Linux
Mientras se escribe un texto (por ejemplo, en el editor de textos LibreOffice Writer o en un navegador), pulsar Ctrl + Shift + ‘u’ y después introducir el código 202F seguido de la tecla “Intro”.
Respecto a la visualización, será necesario configurar el locale en varias puntos del sistema operativo:
- Variables del sistema de idioma y región
- Configuración glibc
- Configuración común CLDR
glibc es una biblioteca común empleada por las aplicaciones Linux, y entre sus funciones se incluye la gestión de los locales del sistema.
CLDR (Common Locale Data Repository) es un conjunto de datos de locales propuestos por Unicode, más moderna y usada también en Windows, macOS o iOS. La biblioteca ICU permite acceder a CLDR, por lo que estos dos términos suelen ir acompañados.
glibc y CLDR mantienen configuraciones en independientes y con formatos propios, pero existe el interés entre mantenedores de que tengan valores equivalentes. Las aplicaciones de terminal o las más tradicionales leen los locales de glibc, mientras que las más modernas tienden a leerlos de CLDR por ser la tendencia multiplataforma. No obstante, CLDR posee más personalizaciones que glibc.
Variables del sistema
Las variables del sistemas de idiomas y región proporciona una fuente de verdad sobre el idioma y la región para para glibc, CLDR y aplicaciones que operan al margen de estas dos últimas.
Las variables del sistema de idioma y región se pueden encontrar en ficheros como /etc/default/locale o /etc/locale.conf. El contenido puede ser como a continuación:
LANG="es_ES.UTF-8"
LANGUAGE="es_ES:es"
# Estas líneas es posible que no figure.
LC_NUMERIC="es_ES.UTF-8"
LC_MONETARY="es_ES.UTF-8"
LC_MEASUREMENT="es_ES.UTF-8"
Editando los ficheros /etc/default/local o /etc/locale.conf (con el comando nano) se puede especificar el idioma del SO. No obstante, los entornos de escritorio como GNOME y KDE proporcionan interfaces gráficas para hacerlo.
En el entorno de escritorio GNOME permite visualizar modificar estas variables del sistema yendo a Configuración > Región e idioma y seleccionando ahí el idioma (que modificará los valores LANG y LANGUAGE del fichero) y los formatos o locales en inglés (que modificará los valores LC_ del fichero).
Desafortunadamente, no existe ningún locale predeterminado que permita seguir estrictamente las recomendaciones de la RAE referidas anteriormente, y además el entorno de escritorio GNOME no permite modificar indidualmente cada aspecto del locale (a diferencia de lo visto en Windows). Es por ello que sería necesario construir un locale personalizado antes de poder seleccionarlo.
glibc
Suelen emplear glibc las aplicaciones de terminal y las basadas en GTK.
La configuración de locales de glibc se suele almacenar en las carpetas /usr/lib/locale/locale-archive o /usr/share/i18n/locales/. Lo primero sería confirmar en qué ruta del sistema se encuentran los locales.
Para crear un locale en glibc, lo primero sería clonar el locale es_ES para crear uno propio a partir de él:
sudo cp /usr/share/i18n/locales/es_ES /usr/share/i18n/locales/es_ES@rae
Lo siguiente sería editar el nuevo fichero con nano:
sudo nano /usr/share/i18n/locales/es_ES@custom
Después, habría que buscar la sección del locale dedicada a los números (LC_NUMERIC) del nuevo fichero para aplicar la configuración detallada en el artículo.
- Separador de decimales: asociar el campo decimal_point al valor “<U002E>” (caracter del punto).
- Separador de agrupaciones de parte entera (millares): asociar el campo thousands_sep al valor “<U202F>” (espacio fino duro).
- Cifras enteras agrupadas: asociar el campo grouping al valor 3
- Mínimo de cifras en las que se aplica los separadores de agrupaciones de parte entera: esta configuración no está disponible en glibc (aunque sí en CLDR). Por ello el número 1234 se mostrará inevitablemente como 1 234.
En el bloque de identificación de local se debe escribir lo siguiente::
LC_IDENTIFICATION
title "Spanish locale for Spain (ISO 80000-1:2009 / RAE 2010)"
source "Custom locale based on es_ES"
address ""
contact ""
email ""
tel ""
fax ""
language "European Spanish"
territory "Spain"
revision "1.0"
date "2026-11-05"
En el bloque de números (LC_NUMERIC) se debe cambiar lo siguiente:
LC_NUMERIC
decimal_point "<U002E>" # cambiado a punto
thousands_sep "<U202F>" # cambiado a espacio fino duro
grouping 3
END LC_NUMERIC
También se debe cambiar LC_MONETARY:
LC_MONETARY
int_curr_symbol "EUR "
currency_symbol "€"
mon_decimal_point "<U002E>" # cambiado a punto
mon_thousands_sep "<U202F>" # cambiado a espacio fino duro
mon_grouping 3
positive_sign ""
negative_sign "-"
int_frac_digits 2
frac_digits 2
p_cs_precedes 0
p_sep_by_space 1
n_cs_precedes 0
n_sep_by_space 1
p_sign_posn 1
n_sign_posn 1
END LC_MONETARY
Una vez modificado el fichero, se debe compilar su contenido mediante el comando localedef (el parámetro -c es opcional y sirve para ignorar errores menores):
sudo localedef -c -f UTF-8 -i es_ES@rae es_ES@rae.UTF-8
Se puede probar el locale de glibc creado con un comando:
LC_NUMERIC="es_ES@rae.UTF-8" printf "%'d\n" 1234567
Lo último sería modificar el fichero de variables del sistema de idioma y región para que estuviera configurado con el nuevo locale:
LANG="es_ES.UTF-8" # se puede mantener como estaba
LANGUAGE="es_ES:es"
LC_NUMERIC="es_ES@rae.UTF-8" # modificado
LC_MONETARY="es_ES@rae.UTF-8" # modificado
LC_MEASUREMENT="es_ES.UTF-8"
https://man7.org/linux/man-pages/man5/locale.5.html
CLDR común
Existe un CLDR común al sistema, que será utilizado por todas aquellas aplicaciones basadas en la biblioteca ICU. Estas incluyen las programadas con el framework Qt, las que usan Electron, o las que estén basadas Node.js, Python y Java y usen ICU.
Modificar CLDR requiere descargar el código fuente de ICU, parchearlo y recompilar las librerías del sistema, lo cual es frágil y se sobrescribe en cada actualización
La configuración de CLDR a modificar sería:
- Los separadores de decimales se configuran en…
- Los separadores de millares se configuran introduciendo el caracter Unicode 202F dentro del tag <group> del símbolo numberSystem=”latn”
- El mínimo número de cifras para aplicar los separadores de millares se configura con minimumGroupingDigits=5.
Para los símbolos de decimales y agrupación:
<symbols numberSystem="latn">
<decimal>.</decimal>
<group> </group> <!-- Aquí va el carácter U+202F (espacio fino duro) -->
</symbols>
Para los formatos decimales:
<decimalFormats numberSystem="latn">
<!-- El patrón '#,##0.00' indica agrupaciones de 3 con decimales,
y 'minimumGroupingDigits="5"' obliga a que no se ponga separador
si el número tiene menos de 5 cifras enteras (ej. 4321 saldrá sin espacio,
pero 12345 saldrá como 12 345). -->
<decimalFormatLength>
<decimalFormat>
<pattern minimumGroupingDigits="5">#,##0.###</pattern>
</decimalFormat>
</decimalFormatLength>
</decimalFormats>
Una vez modificado, se deben compilar los cambios en CLDR, lo que requiere:
- Recompilar todo el paquete de librerías de ICU del sistema operativo e incrustarlas de forma estática o dinámica para que las aplicaciones de escritorio las lean.
- Descargar el código fuente completo del proyecto Unicode CLDR y de la librería ICU.
- Modificar los archivos XML fuente de la localización (
es_ES). - Ejecutar las herramientas de compilación en Java (
cldr-to-icu) para transformar el XML en binarios comprensibles por ICU.
https://unicode.org/reports/tr35/tr35-numbers.html
https://cldr.unicode.org/translation/core-data/numbering-systems
https://github.com/unicode-org/icu/blob/main/docs/userguide/format_parse/numbers/skeletons.md
CLDRs particulares
No obstante, algunas aplicaciones, como los navegadores basados en Chromium y Firefox, emplean su propio CLDR, por lo que los cambios realizados al CLDR común no tienen efecto sobre ellas.
En estos casos, se ajustaría a la RAE modificando las configuraciones propias de las aplicaciones o modificando su CLDR.
LaTeX
La solución más profesional y madura para solventar esta situación en el lenguaje de marcado LaTeX es emplear el paquete siunitx con la configuración adecuada.
En la cabecera del documento .tex se debe incluir el siguiente código:
\usepackage{siunitx}
\sisetup{
output-decimal-marker = {.}, % Punto ISO
group-separator = {\,}, % Espacio fino estricto para millares (Norma ISO)
group-minimum-digits = 5, % Aplica el espacio a partir de 5 dígitos (ej. 10 000)
digit-group-size = 3 % Explicita que se debe agrupar de 3 en 3 (valor predeterminado)
}
Posteriormente, cada vez que se incluya un número que deba seguir ese formato debe aplicarse la macro \num{} o \qty{12345}{\kilogram}. Por ejemplo, el siguiente código:
En \num{2025}, había \qty{1905.794}{\kilometer} de autovías en Castilla y León.
se renderizará como:
En 2025, había 1 905.794 km de autovías en Castilla y León.
Nótese que “2025” es un número de solo cuatro cifras al que no le aplica el uso de separador de millares, tal y como hemos configurado.
Typst
El lenguaje de marcado Typst cuenta con paquetes de la comunidad que aplican el formato a números, como por ejemplo metro (que es un port de siuntx de LaTeX) o unify.
En el caso de usar metro, también requiere usar las funciones #num o #qty cada vez que aparece un número.
#import "@preview/metro:0.3.0": num, setup
#setup(
group-separator: "\u{202F}",
group-minimum-digits: 5,
decimal-marker: "."
)
La presión es de #num(12345.67) pascales, pero ayer fue de #num(4321).