2011-10-18 22 views
10

Tengo una expresión regular de JavaScript para unir números en una cadena, que debo multiplicar y reemplazar.Javascript regex y parseInt

'foo1 bar2.7'.replace(/(\d+\.?\d*)/g, parseInt('$1', 10) * 2); 

Quiero que vuelva 'foo2 bar5.4' pero vuelve 'fooNaN barNaN'

¿Qué estoy haciendo mal aquí?

Respuesta

16

parseInt('$1', 10) * 2 se ejecuta primero y su resultado se pasa a replace. Desea utilizar una función de devolución de llamada:

'foo1 bar2.7'.replace(/(\d+\.?\d*)/g, function(match, number) { 
    return +number * 2; 
}); 

Además, parseInt se redondea hacia abajo cualquier valor de punto flotante, por lo que el resultado sería "foo2 bar4". En su lugar, puede usar el operador unario plus para convertir cualquier cadena numérica en un número.

+0

Huh .. '+ number'? ¿Por qué usa '+ número', explíquelo, muchas gracias. – LiuwkCn

+1

Debe explicarse por la última frase: * "En su lugar, puede usar el operador unario plus para convertir cualquier cadena numérica en un número." * –

+0

¡Lo tengo, gracias! comentar a short.exe, hah. :) – LiuwkCn

1

Está pasando el resultado de parseInt('$1', 10) * 2 a la función replace, en lugar de la instrucción en sí.

su lugar, puede pase una función para replace así:

'foo1 bar2.7'.replace(/(\d+\.?\d*)/g, function (str) { 
    return parseInt(str, 10) * 2; 
}); 

Para obtener más información, lea la MDC article al pasar funciones como parámetro para String.replace

0

Tenga en cuenta que si usted tiene más de una agrupación, puede hacer algo como:

"p-622-5350".replace(/p-(\d+)-(\d+)/, function (match, g1, g2) { 
    return "p-" + (+g1 * 10) + "-" + (+g2 *10); 
}); 

(tenga en cuenta los parámetros adicionales en la función)