Soy nuevo en stackoverflow y agradecería algún consejo que me ayude a resolver este problema. Tengo dos cadenas de las que quiero extraer números.
String 1 = "12.3,Name1,3,4,Name2,35,Name3" devuelve [12.3,3,4,35]
Cuál es el resultado requerido.
String 2 = "12.3,22,Q" devuelve [12.322] ¿Cuál es el resultado incorrecto? Debería ser [12.3,22]
He comentado mi código con los pasos que he tomado para completar la tarea. De nuevo muchas gracias por vuestros consejos y ayuda de antemano.
Aquí hay una copia de mi código:
function extractNumbers(str) { //Use replace() to replace all instances of letters/alpha* let onlyNumbersString = str.replace(/[az]/ig, ''); //remove "," using replace()* onlyNumbersString = onlyNumbersString.replace(",", ""); //Create an array of numbers* let arrayOfNumbers = onlyNumbersString.split(','); let result = arrayOfNumbers.map((x) => parseFloat(x)) console.log(arrayOfNumbers) console.log(result); const filtered = result.filter(function(e) { return e }) console.log(filtered) } let numbers = "12.3,Name1,3,4,Name2,35,Name3" //returns [12.3,3,4,35] //"12.3,22,Q" returns [12.322]* extractNumbers(numbers)Simplemente puede dividir en , verificar si es un número válido de no
function extractNumbers(str) { let onlyNumbersString = str.split(',').filter(v => /^\d+(\.\d+)?$/.test(v)) console.log(onlyNumbersString) } let numbers = "12.3,Name1,3,4,Name2,35,Name3" //returns [12.3,3,4,35] //"12.3,22,Q" returns [12.322]* extractNumbers(numbers) extractNumbers('12.3,22,Q') Si no quiere usar expresiones regulares, puede usar isNaN
let onlyNumbersString = str.split(',').filter(v => v.trim() && !isNaN(v))Creo que puede generar la salida deseada utilizando la siguiente expresión regular
Esto supone que no hay cadenas como Name2 45
const str = "12.3,Name1,3,4,Name2,35,Name3"; console.log(str.match(/\b\d+\.?\d*\b/g))El resultado incorrecto se debe a esta línea:
onlyNumbersString = onlyNumbersString.replace(",", ""); Una vez que haces eso, "12.3,22," (que era "12.3,22,Q" pero se le quitó la Q antes) se convierte en "12.322" , por lo que parece un solo número.
Primero dividiría, luego eliminaría los segmentos que no tienen texto numérico y luego los convertiría en números:
function extractNumbers(str) { // Split on commas, since that seems to be the delimiter you want const parts = str.split(","); // Remove any strings that aren't all number chars (including `.`) const filtered = parts.filter((s) => !/[^.\d]/.test(s)); // Convert to number const numbers = filtered.map((s) => parseFloat(s)); return numbers; } console.log(extractNumbers("12.3,Name1,3,4,Name2,35,Name3"));O sin comentarios:
function extractNumbers(str) { const parts = str.split(","); const filtered = parts.filter((s) => !/[^.\d]/.test(s)); const numbers = filtered.map((s) => parseFloat(s)); return numbers; }Podría convertirlo en una sola declaración, pero se vuelve más difícil de depurar:
function extractNumbers(str) { return str .split(",") .filter((s) => !/[^.\d]/.test(s)) .map((s) => parseFloat(s)); } Debo señalar que la única razón para verificar que un segmento es válido es que parseFloat aceptará felizmente "123abc" , devolviendo 123 e ignorando el resto. Podría usar el operador unario + o la función Number en su lugar, verificando el caso "" (que le daría 0 si no lo eliminara):
function extractNumbers(str) { const parts = str.split(","); const numbers = parts.map((s) => s.trim() ? +s : NaN); const validNumbers = numbers.filter((num) => !isNaN(num)); return validNumbers; } console.log(extractNumbers("12.3,Name1,3,4,Name2,35,Name3"));Mi respuesta aquí pasa por las diversas opciones para convertir cadenas en números y las trampas de cada una de ellas.