Strings y números sin sorpresas: parseo, formato y precisión

Aprende a convertir y formatear datos de formularios y APIs sin caer en coerciones accidentales ni errores de redondeo, con un flujo de trabajo robusto para frontend real.

En frontend, casi todos los datos de usuario llegan como texto: inputs, query params, localStorage o respuestas de API mal tipadas.

Si no controlas cuándo usar <code>String(...)</code>, <code>Number(...)</code> o <code>parseFloat(...)</code>, empiezan los bugs silenciosos: totales mal calculados, comparaciones que fallan o formatos inconsistentes.

En esta lección vas a construir un criterio sólido para convertir, validar y presentar texto y números con precisión de producto real.

Lo que desbloquea este bloque: podrás alimentar mejor tus pipelines de [javascript-metodos-array-medio](/curso/javascript/leccion/javascript-metodos-array-medio) y tus reglas condicionales de [javascript-control-flujo-basico](/curso/javascript/leccion/javascript-control-flujo-basico).

  • No mezcles responsabilidades: primero interpreta, luego calcula, después formatea.
  • Piensa en cuatro pasos: (1) recibes dato crudo, casi siempre string; (2) lo conviertes al tipo correcto; (3) validas que sea utilizable; (4) lo formateas para mostrarlo al usuario.
  • Separar estas fases evita meter <code>Number(...)</code> en cualquier sitio y te permite depurar más rápido cuando una pantalla muestra un total raro.
  • Convertir no es suficiente: hay que limpiar y validar.
  • <code>Number('')</code> devuelve <code>0</code>, lo que puede introducir falsos positivos en formularios. Por eso conviene limpiar y tratar casos vacíos explícitamente.

Modelo mental: entrada, conversión, validación y salida

No mezcles responsabilidades: primero interpreta, luego calcula, después formatea.

Piensa en cuatro pasos: (1) recibes dato crudo, casi siempre string; (2) lo conviertes al tipo correcto; (3) validas que sea utilizable; (4) lo formateas para mostrarlo al usuario.

Separar estas fases evita meter <code>Number(...)</code> en cualquier sitio y te permite depurar más rápido cuando una pantalla muestra un total raro.

Parseo seguro de datos numéricos

Convertir no es suficiente: hay que limpiar y validar.

<code>Number('')</code> devuelve <code>0</code>, lo que puede introducir falsos positivos en formularios. Por eso conviene limpiar y tratar casos vacíos explícitamente.

Cuando viene separador de miles, limpia primero el string (por ejemplo quitando comas) y después parsea. Si el resultado no es finito, corta el flujo con mensaje claro.

  • <code>Number()</code> es estricto: útil cuando esperas todo el string válido.
  • <code>parseFloat()</code> acepta prefijos numéricos: úsalo con cuidado.
  • Valida siempre con <code>Number.isFinite()</code> antes de operar.

Formatear para usuario sin perder precisión de cálculo

Calcula con números, presenta con formato humano.

No uses el valor formateado para seguir calculando. El formato es solo capa de presentación. Primero calcula con números puros; al final conviertes a string para UI.

<code>Intl.NumberFormat</code> es preferible a concatenar símbolos manualmente porque respeta idioma, separadores y moneda.

Precisión decimal: por qué 0.1 + 0.2 da guerra

JavaScript usa coma flotante binaria; hay que saber convivir con ello.

Operaciones como <code>0.1 + 0.2</code> pueden producir <code>0.30000000000000004</code>. No es bug de tu app: es representación interna de floating point.

Para dinero, estrategia clásica: trabajar en céntimos enteros y solo formatear al final. Para redondeos puntuales, añade <code>Number.EPSILON</code> antes de <code>Math.round</code>.

Errores comunes y cómo depurarlos rápido

Depurar datos mixtos es más sencillo cuando registras tipo y valor juntos.

Cuando algo no cuadra en un cálculo, loguea <code>typeof</code>, valor original y valor convertido en la misma traza. Eso reduce muchísimo el tiempo de diagnóstico.

Evita corregir a ciegas: primero identifica en qué fase falla (entrada, conversión, validación o salida).

JavaScript
19

Strings y números sin sorpresas: parseo, formato y precisión

Aprende a convertir y formatear datos de formularios y APIs sin caer en coerciones accidentales ni errores de redondeo, con un flujo de trabajo robusto para frontend real.

Código del tema: Number() · parseFloat() · Intl.NumberFormat · toFixed()

📘 Teoría

Modelo mental: entrada, conversión, validación y salida

No mezcles responsabilidades: primero interpreta, luego calcula, después formatea.

Piensa en cuatro pasos: (1) recibes dato crudo, casi siempre string; (2) lo conviertes al tipo correcto; (3) validas que sea utilizable; (4) lo formateas para mostrarlo al usuario.

Separar estas fases evita meter Number(...) en cualquier sitio y te permite depurar más rápido cuando una pantalla muestra un total raro.

1

Entrada

Dato sin confianza todavía.

  • '19.99' desde input
  • '1,250.40' desde API legacy
2

Conversión

Transformar a tipo de trabajo.

  • String(valor)
  • Number(valor) o parseFloat(valorLimpio)
3

Validación

Comprobar que no hay basura.

  • Number.isFinite(numero)
  • Rangos de negocio
4

Salida

Presentar sin romper UX.

  • Intl.NumberFormat para moneda
  • Template literals para texto

Parseo seguro de datos numéricos

Convertir no es suficiente: hay que limpiar y validar.

Number('') devuelve 0, lo que puede introducir falsos positivos en formularios. Por eso conviene limpiar y tratar casos vacíos explícitamente.

Cuando viene separador de miles, limpia primero el string (por ejemplo quitando comas) y después parsea. Si el resultado no es finito, corta el flujo con mensaje claro.

  • Number() es estricto: útil cuando esperas todo el string válido.
  • parseFloat() acepta prefijos numéricos: úsalo con cuidado.
  • Valida siempre con Number.isFinite() antes de operar.
Función robusta para importe
function parseImporte(raw) {
  const texto = String(raw).trim();

  if (!texto) return null;

  const normalizado = texto.replace(/,/g, '');
  const numero = Number(normalizado);

  if (!Number.isFinite(numero)) return null;
  return numero;
}

console.log(parseImporte(' 1,250.40 ')); // 1250.4
console.log(parseImporte('abc')); // null

Formatear para usuario sin perder precisión de cálculo

Calcula con números, presenta con formato humano.

1

No uses el valor formateado para seguir calculando. El formato es solo capa de presentación. Primero calcula con números puros; al final conviertes a string para UI.

2

Intl.NumberFormat es preferible a concatenar símbolos manualmente porque respeta idioma, separadores y moneda.

Formato de moneda en español
const monedaES = new Intl.NumberFormat('es-ES', {
  style: 'currency',
  currency: 'EUR'
});

const subtotal = 1234.5;
const iva = subtotal * 0.21;
const total = subtotal + iva;

console.log(`Subtotal: ${monedaES.format(subtotal)}`);
console.log(`IVA: ${monedaES.format(iva)}`);
console.log(`Total: ${monedaES.format(total)}`);

Precisión decimal: por qué 0.1 + 0.2 da guerra

JavaScript usa coma flotante binaria; hay que saber convivir con ello.

1

Operaciones como 0.1 + 0.2 pueden producir 0.30000000000000004. No es bug de tu app: es representación interna de floating point.

2

Para dinero, estrategia clásica: trabajar en céntimos enteros y solo formatear al final. Para redondeos puntuales, añade Number.EPSILON antes de Math.round.

Céntimos enteros y redondeo estable
const precioA = 10.1;
const precioB = 20.2;

const totalCentimos = Math.round(precioA * 100) + Math.round(precioB * 100);
const total = totalCentimos / 100;

const redondeo2 = (n) => Math.round((n + Number.EPSILON) * 100) / 100;

console.log(total); // 30.3
console.log(redondeo2(1.005)); // 1.01

Errores comunes y cómo depurarlos rápido

Depurar datos mixtos es más sencillo cuando registras tipo y valor juntos.

1

Cuando algo no cuadra en un cálculo, loguea typeof, valor original y valor convertido en la misma traza. Eso reduce muchísimo el tiempo de diagnóstico.

2

Evita corregir a ciegas: primero identifica en qué fase falla (entrada, conversión, validación o salida).

Traza mínima útil
function auditar(raw) {
  const convertido = Number(String(raw).trim());
  console.log({ raw, tipoRaw: typeof raw, convertido, tipoConvertido: typeof convertido });
}

auditar(' 42 ');
auditar('42px');

🧪 Aprende probando

Ejemplo Ejemplo guiado: total de checkout con datos de formulario Convierte precio y cantidad desde strings, valida y calcula subtotal/IVA/total con salida lista para UI.
Ejemplo Ejemplo guiado: normalizar etiquetas y porcentajes Limpia strings de producto, convierte descuento textual a número y genera texto de salida consistente.
Ejemplo Demo interactiva: calculadora de pedido con validación Introduce precio, cantidad y descuento. La demo limpia datos, calcula y te avisa cuando la entrada no es válida.

🏁 Retos

Reto Reto 1: parser de precio robusto Implementa una función que convierta texto a número y devuelva `null` cuando no sea válido.
Reto Reto 2: total con descuento y formato final Calcula subtotal, descuento y total con números válidos y muestra un mensaje formateado para interfaz.

¿Qué es esto?

Soy Cristian Eslava y a veces hago webs para procrastinar yo y vosotros 😉.

Esta la hice en febrero de 2026 para facilitar el aprendizaje de mis alumnxs. Aprender desarrollo web practicando. La idea es que crezca semanalmente con nuevos temas, tests y retos.

Inspirado en MDN, en W3Schools, en Codepen, en el crack de Manz y en mil sitios de documentación sobre desarrollo web. Quería aportar además de bloques teóricos con ejemplos, la gamificación de los retos y el sistema de test que ya tenía en culTest .

Si te gustó, si no te gustó, si quieres saludarme, o invitarme a 🍻 no dudes en escribirme en cristianeslava@gmail.com .