Pregunta simple y rápida (y sí, lo busqué en Google primero, me confundieron con la verificación del número de teléfono y otras cosas), ¡de todos modos! de vuelta al punto
¿Por qué cuando ingreso datos y los envío a la base de datos, almacena todo como una cadena a pesar de que configuré el tipo de esa entrada como un 'número'?
Fragmento de ejemplo de código
//some code that makes sense (and is working so far except for the data type) docRef.set({ precio: precio }) //Some more code that makes sense as well <input onChange = {(e) => {setPrecio(e.target.value);}} type = 'number' pattern = "[0-9]*" required placeholder="Precio" />Entonces, básicamente, envío algunos datos a Firebase y hace una colección si no hay ninguno y un documento con los datos que estoy enviando, ahora el problema es que los datos se configuran como una cadena y los quiero como un número entonces Puedo usar ese valor más tarde para hacer algunas matemáticas inteligentes, supongo.
Código completo de los bits importantes
//Relevant variable const [precio, setPrecio] = useState(""); // Sending all the data I have gathered to the database const register = (e) => { e.preventDefault(); const docId = `${grado} | ${descripcion}`; const docRef = db.collection('libros').doc(docId); console.log(typeof precio) docRef.get().then((doc) => { if (doc.exists) { window.alert("Ya existe ese libro") } else { docRef.set({ materia: materia, descripcion: descripcion, editorial: editorial, grado: grado, precio: precio, id: docRef.id }).then((r) => { window.alert("Libro agregado") })} }) } //The bad boy number that still wants to get printed as a string <div className = "CrearE_row"> <input onChange = {(e) => {setPrecio(e.target.valueAsNumber);}} type = 'number' pattern = "[0-9]*" required placeholder="Precio" /> </div>Lo más probable es que esté enviando datos de tipo String, incluso si solo contienen números. Esto es bastante clásico cuando ingresa datos a través de un formulario HTML.
Puede verificar eso con el operador typeof , de la siguiente manera:
console.log(typeof precio); docRef.set({ precio: precio }) La consola probablemente imprimirá "cadena". Por lo tanto, debe convertir el valor de precio en un número, por ejemplo, con parseInt() , parseFloat() o Number() .
Puedes ver con el siguiente código que si pasas un número, se guarda correctamente en la BD.
const precio = 1234; // We declare a number console.log(typeof precio); docRef.set({ precio: precio })Apéndice:
Como se explica en esta respuesta SO , también podría usar e.target.valueAsNumber en lugar de e.target.value .
Cualquiera que todavía se pregunte entonces, tuve el mismo problema pero usé "parseInt ()" mientras lo enviaba a la base de fuego usando addDoc. Esperemos que esto lo aclare. Y gracias a Renaud.