
🔢 Traducción de números con PHP y JavaScript: numerales arábigos a devanagari y viceversa
Un usuario rellena un formulario en un sitio web y los números se convierten en caracteres ilegibles. Esta es una situación familiar para cualquiera que trabaje con proyectos multilingües: la versión nepalí de una tienda en línea muestra los precios en अक्षर y el formulario de contacto falla la validación por dígitos «incorrectos».
El problema es que los distintos idiomas utilizan sistemas de numeración diferentes. El inglés y el ruso usan números arábigos (0-9). El hindi, el nepalí y el maratí usan símbolos devanagari (०-९). PHP y JavaScript no alternan entre ellos de forma nativa. Sin embargo, la tarea puede resolverse sin una sola librería externa, usando únicamente funciones de cadena integradas. Sin dependencias que instalar, sin APIs de terceros.
A continuación, dos fragmentos de código listos para usar que resuelven este problema en 5 minutos. Sin frameworks, sin paquetes de Composer, sin dependencias de npm, solo PHP puro y JavaScript vanilla. Cópielos, sustituya sus símbolos y funciona.
💡 Resumen rápido:
- Copie la función PHP en el archivo functions.php de su tema o mediante el plugin Code Snippets; convierte números arábigos a devanagari y viceversa
- Para el frontend, use el código JavaScript listo con objetos diccionario para la conversión sobre la marcha directamente en el campo de entrada
- La sustitución usa una tabla de correspondencia de glifos en lugar de matemáticas, lo que hace el método universal para cualquier sistema de escritura
- Pruébelo: pase 1234 y obtenga १२३४, y viceversa; ambas direcciones funcionan simétricamente
Cómo funcionan los sistemas de numeración en diferentes idiomas
La mayoría de los sitios web trabajan con números arábigos: 0 1 2 3 4 5 6 7 8 9. Históricamente, este sistema provino de la India, pero se difundió a través del mundo árabe, de ahí el nombre.
Existen conjuntos alternativos en docenas de sistemas de escritura. El devanagari (hindi, nepalí, maratí) usa su propia serie: ० १ २ ३ ४ ५ ६ ७ ८ ९. Los números arábigos orientales (árabe, persa, urdu) usan un conjunto diferente: ٠ ١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ ٩. El bengalí, el tailandés y el jemer tienen cada uno sus propios glifos y sus propios rangos Unicode. Hay más de veinte sistemas de este tipo en total.
Pero el valor numérico sigue siendo el mismo. 5, ५ y ٥ son todos el mismo número «cinco», solo que escrito con símbolos diferentes. Por lo tanto, la traducción entre sistemas es una sustitución de glifos usando una tabla de correspondencia, no una conversión matemática. No hay nada que recalcular; solo necesita conocer los pares de símbolos correctos.
Este es exactamente el principio detrás del código a continuación.
Paso 1: Convertir números con PHP

El enfoque en PHP es tan simple como parece: la función str_replace() toma dos arrays, qué buscar y con qué reemplazar. La cadena se procesa en una sola pasada y todas las coincidencias se reemplazan.
Añada este código al archivo functions.php de su tema hijo o mediante el plugin Code Snippets. La función acepta un número o una cadena que contenga dígitos y devuelve el resultado con símbolos devanagari.
1 <?php 2 /** 3 * Converts Arabic numerals to Devanagari characters (Hindi, Nepali). 4 * 5 * @param string|int $input String or number to convert. 6 * @return string String with Devanagari numerals. 7 */ 8 function convert_to_devanagari($input) { 9 $english = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); 10 $devanagari = array("०", "१", "२", "३", "४", "५", "६", "७", "८", "९"); 11 12 return str_replace($english, $devanagari, (string) $input); 13 } 14 15 /* Usage example */ 16 echo convert_to_devanagari(2026); 17 // Output: २०२६ 18 ?>
Lo que sucede aquí: str_replace() itera a través del array $english y, para cada elemento (por ejemplo, "2"), sustituye el elemento correspondiente del array $devanagari ("२"). La conversión a (string) asegura que la función funcione tanto con números como con cadenas.
La conversión inversa, de devanagari a números arábigos, se realiza intercambiando los arrays:
1 <?php 2 /** 3 * Converts Devanagari characters back to Arabic numerals. 4 * 5 * @param string $input String with Devanagari numerals. 6 * @return string String with Arabic numerals. 7 */ 8 function convert_from_devanagari($input) { 9 $english = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); 10 $devanagari = array("०", "१", "२", "३", "४", "५", "६", "७", "८", "९"); 11 12 return str_replace($devanagari, $english, $input); 13 } 14 15 /* Example */ 16 echo convert_from_devanagari('२०२६'); 17 // Output: 2026 18 ?>
Los arrays son los mismos; solo cambia el orden de los argumentos. El primer array ahora contiene símbolos devanagari (lo que buscamos), el segundo contiene números arábigos (con lo que reemplazamos).
Dónde usarlo. La función es útil en cualquier parte del tema donde se muestren números: precios de productos en WooCommerce, fechas en entradas de blog, numeración de páginas. Envuelva la llamada donde necesite la localización de dígitos para una audiencia específica.
Manejo de casos límite en PHP
La función convert_to_devanagari() acepta string|int, pero en la práctica la entrada puede ser cualquier cosa. ¿Qué sucede si pasa null, una cadena vacía o una cadena sin dígitos? (string) null devuelve una cadena vacía, y str_replace() con una cadena vacía también devuelve vacío sin errores. Una cadena sin dígitos (por ejemplo, "Hello") se devuelve sin cambios, ya que la sustitución no encuentra coincidencias.
Si el número contiene separadores (comas para los miles, un punto para los decimales), estos permanecen en su lugar; solo se reemplazan los dígitos en sí. Para números de punto flotante, este comportamiento es correcto, pero si el formato del número es importante y los separadores deben cambiar según la configuración regional, añada un procesamiento separado mediante number_format() antes de la conversión.
Para números muy largos (por ejemplo, identificadores de 20 dígitos), el enfoque funciona sin cambios: str_replace() procesa cadenas de cualquier longitud, limitado solo por la memoria disponible de PHP. Los caracteres devanagari ocupan 3 bytes cada uno en UTF-8, por lo que la cadena resultante será más larga que la original en bytes. Para el conteo de caracteres, use mb_strlen(), no strlen().
Paso 2: Convertir números con JavaScript
En el frontend, la misma lógica se implementa usando objetos diccionario y el método String.replace() con una expresión regular. Esto es conveniente para interfaces dinámicas: el usuario ingresa un número en un campo y el script muestra instantáneamente el equivalente devanagari.
Coloque este código en un archivo .js separado en su tema o mediante wp_add_inline_script en functions.php. Sin dependencias, ES5 plano, funciona incluso en navegadores antiguos.
1 /** 2 * Dictionaries for translating between Arabic numerals and Devanagari. 3 */ 4 var englishToDevanagari = { 5 '0': '०', '1': '१', '2': '२', '3': '३', '4': '४', 6 '5': '५', '6': '६', '7': '७', '8': '८', '9': '९' 7 }; 8 9 var devanagariToEnglish = { 10 '०': '0', '१': '1', '२': '2', '३': '3', '४': '4', 11 '५': '5', '६': '6', '७': '7', '८': '8', '९': '9' 12 }; 13 14 /** 15 * Converts Arabic numerals in a string to Devanagari characters. 16 * @param {string|number} input 17 * @returns {string} 18 */ 19 function toDevanagari(input) { 20 return String(input).replace(/[0-9]/g, function(match) { 21 return englishToDevanagari[match]; 22 }); 23 } 24 25 /** 26 * Converts Devanagari characters to Arabic numerals. 27 * @param {string} input 28 * @returns {string} 29 */ 30 function fromDevanagari(input) { 31 return input.replace(/[०-९]/g, function(match) { 32 return devanagariToEnglish[match]; 33 }); 34 } 35 36 // Examples: 37 console.log(toDevanagari(9857)); // ९८५७ 38 console.log(fromDevanagari('१२३४')); // 1234
El punto clave es la expresión regular /[0-9]/g. El modificador g (global) hace que replace() procese cada dígito de la cadena, no solo el primero. La función de retrollamada anónima recibe el carácter coincidente y devuelve su equivalente del diccionario.
Para los dígitos devanagari, se usa el rango [०-९]; en Unicode estos caracteres son secuenciales, por lo que la expresión regular funciona correctamente.
Dónde usarlo. Entrada en vivo en formularios (conversión sobre la marcha mientras se escribe), visualización de precios y fechas en versiones localizadas del sitio, conversión inversa antes de enviar el formulario al servidor para que los números arábigos siempre lleguen a la base de datos.
Ejemplo práctico: formulario de contacto con conversión sobre la marcha
Combinemos ambos enfoques en una configuración funcional. Supongamos que la versión nepalí de un sitio tiene un formulario de pedido donde el usuario ingresa un importe en devanagari. La tarea: mostrar el número ingresado en ambos sistemas para su verificación y enviar números arábigos al servidor.
El marcado del formulario contiene un <input> y un bloque de vista previa. Con cada pulsación de tecla en el campo, se activa el manejador de eventos input, que llama a toDevanagari() y muestra el resultado en un <span> adyacente. Cuando se envía el formulario, se activa fromDevanagari() y el cuerpo de la solicitud POST enviada al servidor contiene números arábigos. El código PHP del lado del servidor recibe el número en formato estándar y trabaja con él como de costumbre, sin conversión adicional.
Este mismo patrón se aplica a campos de precio, fechas, números de teléfono y cualquier otro campo donde el usuario espera ver su sistema de numeración nativo mientras que el sistema necesita almacenar un formato unificado. La conversión toma microsegundos y no afecta la capacidad de respuesta de la interfaz.
Véase también: video sobre sistemas de numeración en programación
Para una visión más amplia del tema de cómo funcionan los sistemas de numeración en el código y cómo convertir entre ellos en JavaScript, vea este análisis de Techno Geek. Cubre los sistemas binario, octal y decimal con un proyecto listo para usar.
⁉️🤔 Preguntas frecuentes
¿Puede este mismo método convertir dígitos a árabe (símbolos arábigos orientales)?
Sí. Reemplace el array devanagari con los símbolos arábigos orientales:
array("٠", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩"). La lógica es la misma:str_replace()en PHP y un diccionario con expresión regular en JS. Se adapta con la misma facilidad al bengalí, tailandés, jemer y cualquier otro sistema de escritura con sus propios glifos numéricos.
¿Es seguro usar str_replace() para cadenas multibyte en PHP?
Sí,
str_replace()funciona correctamente con UTF-8 y caracteres multibyte, a diferencia destrpos()osubstr(), que necesitan equivalentes de mbstring. Los símbolos devanagari (२,३) ocupan 3 bytes cada uno en UTF-8, perostr_replace()los maneja de manera segura a nivel de bytes porque busca coincidencias exactas de secuencias binarias. No habrá problemas.
¿Qué sucede si la cadena contiene una mezcla de números arábigos y símbolos devanagari?
Ambas funciones procesan solo sus respectivos rangos. Si
convert_to_devanagari()recibe la cadena"Price: 500 रुपय", el número500se convierte en५००mientras que el texto permanece intacto. La función inversaconvert_from_devanagari()afecta solo a los dígitos devanagari. La entrada mixta se maneja correctamente de forma automática.
¿Cómo puedo aplicar la conversión a todos los números en una página de WordPress sin editar cada plantilla?
Use el enfoque de JavaScript del paso 2 y ejecute un recorrido de nodos del DOM al cargar la página. Encuentre todos los nodos de texto que contengan dígitos (mediante
TreeWalkero recorrido recursivo dechildNodes) y apliquetoDevanagari()a su contenido. Para el enfoque PHP en el lado del servidor, use un filtro enthe_contentogettextsi los números están incrustados en las traducciones.
¿Dónde puedo encontrar tablas de caracteres para otros sistemas de escritura?
La fuente autorizada es el Consorcio Unicode. Para los dígitos devanagari, este es el rango U+0966-U+096F. El árabe oriental es U+0660-U+0669. El bengalí es U+09E6-U+09EF. Simplemente copie los caracteres de la tabla y sustitúyalos en los arrays; el código no necesita cambios.
Rendimiento y limitaciones del enfoque
str_replace() con arrays de 10 elementos realiza exactamente 10 comparaciones para cada posición en la cadena. Para una cadena típica con 5-10 dígitos, esto significa 50-100 operaciones; el tiempo de ejecución se mide en microsegundos. En comparación, el enfoque que usa preg_replace_callback() con una expresión regular añade sobrecarga por la compilación del patrón y la invocación de la retrollamada para cada coincidencia. La diferencia es imperceptible para cadenas pequeñas, pero str_replace() gana en grandes volúmenes.
La principal limitación del enfoque es que reemplaza glifos, no la semántica del número. Si necesita aritmética con números devanagari (suma, multiplicación), PHP no reconocerá los símbolos devanagari como números. Convierta siempre a números arábigos antes de las operaciones matemáticas y vuelva a convertir después. Esto no es un defecto del método, sino una consecuencia de la diferencia entre los sistemas de escritura y los tipos de datos numéricos.
Otro matiz: el método asume una correspondencia uno a uno de «un glifo, un dígito». Para sistemas de escritura donde los números se escriben con ligaduras compuestas (como en algunos sistemas históricos), el enfoque de reemplazo simple no funcionará. Pero para todas las escrituras índicas modernas (devanagari, bengalí, gurmukhi, gujarati, odia, tamil, telugu, kannada, malayalam), así como para los números arábigos orientales, la correspondencia es estrictamente 1 a 1 y el método funciona a la perfección.
Qué implementar en producción: ¿PHP, JavaScript o ambos?
La solución PHP es para los casos en que los números deben representarse en el sistema de símbolos de destino en el servidor antes de que se envíe el HTML. Esto es correcto para el SEO: el motor de búsqueda ve el contenido inmediatamente en la configuración regional de destino, no números arábigos que luego son reemplazados por un script. Para una tienda WooCommerce, esto significa que los precios del catálogo y las páginas de producto se indexan con dígitos devanagari, lo que afecta positivamente el posicionamiento en los segmentos nepalí e hindi.
La variante JavaScript es para la interacción dinámica: un campo de entrada con vista previa instantánea, cambio de idioma sin recargar la página, conversión de datos del formulario antes del envío. También es indispensable para aplicaciones de una sola página (SPA) donde el servidor devuelve JSON con números arábigos y el frontend los representa en la configuración regional del usuario.
En la práctica, una combinación funciona bien: PHP renderiza la página con dígitos localizados para la indexación, mientras que JavaScript maneja la entrada del usuario y convierte de ida y vuelta sobre la marcha. Ambos fragmentos de código, sin dependencias externas, suman menos de 40 líneas combinadas y resuelven completamente la tarea para cualquier sistema de escritura con sus propios glifos numéricos.
Antes de implementar en producción, pruebe tres escenarios: una llamada directa a la función con un número, una cadena con contenido mixto (dígitos más texto) y la conversión inversa. Asegúrese de que los números arábigos siempre lleguen al servidor y que la interfaz muestre al usuario el sistema que coincide con sus expectativas de idioma. Cinco minutos de prueba ahorran horas de depuración en tráfico real.
Copie ambos fragmentos de código en su proyecto, sustituya los símbolos necesarios de la tabla Unicode para su sistema de escritura y la tarea estará resuelta. Todo lo que necesita ya está integrado en el lenguaje.



