¿Cómo puedo extraer un número de una cadena en JavaScript?

434

Tengo una cadena en JavaScript (por ejemplo #box2) y solo quiero la 2de ella.

Lo intenté:

var thestring = $(this).attr('href');
var thenum = thestring.replace( /(^.+)(\w\d+\w)(.+$)/i,'$2');
alert(thenum);

Todavía regresa #box2en la alerta, ¿cómo puedo hacer que funcione?

Debe adaptarse a cualquier número de longitud adjunto en el extremo.

3
  • 1
    simplemente puedes hacer esto. funcionará bien. var thestring = $ (esto) .attr ('href'); var thenum = parsefloat (thestring); alerta (thenum); 3 de julio de 2017 a las 11:10
  • 1
    este código funciona bien para mí, pero para un caso, tengo una cadena '2.5 / mile' y quiero extraer 2.5 de esto. El código anterior me da 25 en lugar de 2.5 27 de agosto de 2017 a las 11:07
  • 1
    Relacionado: stackoverflow.com/q/1862130/1066234
    Avatar
    12/01/18 a las 16:47
710

Para este ejemplo específico,

 var thenum = thestring.replace( /^\D+/g, ''); // replace all leading non-digits with nothing

en el caso general:

 thenum = "foo3bar5".match(/\d+/)[0] // "3"

Dado que esta respuesta ganó popularidad por alguna razón, aquí hay una ventaja: generador de expresiones regulares.

function getre(str, num) {
  if(str === num) return 'nice try';
  var res = [/^\D+/g,/\D+$/g,/^\D+|\D+$/g,/\D+/g,/\D.*/g, /.*\D/g,/^\D+|\D.*$/g,/.*\D(?=\d)|\D+$/g];
  for(var i = 0; i < res.length; i++)
    if(str.replace(res[i], '') === num) 
      return 'num = str.replace(/' + res[i].source + '/g, "")';
  return 'no idea';
};
function update() {
  $ = function(x) { return document.getElementById(x) };
  var re = getre($('str').value, $('num').value);
  $('re').innerHTML = 'Numex speaks: <code>' + re + '</code>';
}
<p>Hi, I'm Numex, the Number Extractor Oracle.
<p>What is your string? <input id="str" value="42abc"></p>
<p>What number do you want to extract? <input id="num" value="42"></p>
<p><button onclick="update()">Insert Coin</button></p>
<p id="re"></p>
13
  • 20
    -1, "#box2_col3".replace( /^\D+/g, '')debería haber mostrado 2, no 2_col3. 4/04/12 a las 1:27
  • 2
    @ shiplu.mokadd.im: No veo ninguna referencia #box2_col3en la pregunta.
    georg
    4 abr 12 a las 1:30
  • 2
    Sí, no hay referencia de #box2_col3. Pero vea la expresión regular OP used ( \w)(.+$)) que indica claramente que hay otros caracteres después del número. 4/04/12 a las 1:33
  • 3
    en ese caso, su patrón también falla si hay un número antes del final. 4/04/12 a las 1:40
  • 2
    Puede hacer que replacefuncione con números theString.replace(/^.*\D+/g, '');iniciales usando:, pero la solución de shiplu.mokadd.im es mejor. 4/04/12 a las 2:35
266

Deberías probar lo siguiente:

var txt = "#div-name-1234-characteristic:561613213213";
var numb = txt.match(/\d/g);
numb = numb.join("");
alert (numb);​

resultado

1234561613213213
3
  • 1
    buena respuesta, pero ¿qué pasa si quiero el conjunto de números por separado? es decir, 1234, 5616133 ... 23/12/18 a las 17:55
  • 1
    O una línea + análisis sintáctico a entero: parseInt(txt.match(/\d/g).join(''), 10) 19/04/19 a las 11:52
  • " $ 20.0 ".match(/\d/g).join('') => "200" (solo digo)
    vsync
    19/12/19 a las 9:41
127

Creo que esta expresión regular le servirá a su propósito:

var num = txt.replace(/[^0-9]/g,'');

¿Dónde txtestá tu cuerda?

Básicamente, arranca cualquier cosa que no sea un dígito.

Creo que puedes lograr lo mismo usando esto también:

var num = txt.replace(/\D/g,'');
1
65

Intente lo siguiente: string.replace(/[^0-9]/g, '');Esto eliminará todos los caracteres que no sean dígitos, dejando solo dígitos en la cadena

function retnum(str) { 
    var num = str.replace(/[^0-9]/g, ''); 
    return parseInt(num,10); 
}

console.log('abca12bc45qw'.replace(/[^0-9]/g, ''));
console.log('#box2'.replace(/[^0-9]/g, ''));
1
  • 5
    Esto es mejor que la respuesta aceptada, ya que reemplaza todos los que no son números a nivel mundial y, por cierto, /[^0-9]/gse puede reemplazar con /[^\d]/g. 19 mar 19 a las 12:05
53

Utilizando la función de coincidencia.

var thenum = "0a1bbb2".match(/\d+$/)[0];
console.log(thenum);
5
  • 1
    También puede agregar unario '+' para hacerlo entero var thenum = + thestring.match (/ \ d + $ /) [0]; 5 mar 14 a las 7:00
  • ¿Supongo que esto no funciona para> números de 1 dígito? (Entiendo que la pregunta era para números de 1 dígito, pero estoy viendo números posibles> 10.)
    Felix
    24 de junio de 2014 a las 4:57
  • @nissemand Dont supongo . Pruébelo usted mismo. Incluso tú no viste el violín. 24 de junio de 2014 a las 6:35
  • Me gusta esto. Una forma más sencilla de extraer el número en una variable sin tocar ni modificar el elemento. Agradecería un combo con cada uno para varias coincidencias dentro de una cadena. es decir, la cadena 12a55 informa el último número, no todos.
    m3nda
    25/02/15 a las 0:14
  • 1
    @YevgeniyAfanasyev no debería. Revisa la pregunta original. Especialmente la última línea. El número debe estar al final. 29/04/15 a las 7:25
37

Y este es un fragmento que extrae precios con moneda y formato:

var price = "£1,739.12";
parseFloat(price.replace( /[^\d\.]*/g, '')); // 1739.12
1
  • 1
    ¿Y si quiero 1.739,12? 22/09/20 a las 13:53
34

Probé todas las combinaciones citadas anteriormente con este Código y lo hice funcionar, fue el único que funcionó en esa cadena ->(12) 3456-7890

var str="(12) 3456-7890";
str.replace( /\D+/g, '');

Resultado: "1234567890"

Obs: sé que una cadena como esa no estará en el attr, pero como sea, la solución es mejor, porque es más completa.

1
  • Creo que será mejor str.match(/\d+/g).map(Number)que devolverá una matriz 13/11/18 a las 3:05
18

puedes usar un gran método parseInt

convertirá los dígitos iniciales en un número

parseInt("-10px");
// will give you -10
2
  • 22
    esto solo funciona cuando el número está al principio de la cadena
    Russj
    21 de mayo de 2015 a las 3:53
  • 3
    está regresando NaN 8 de noviembre de 2017 a las 9:34
9

Para una cadena como #box2, esto debería funcionar:

var thenum = thestring.replace(/^.*?(\d+).*/,'$1');

jsFiddle:

7

function justNumbers(string) 
{
   var numsStr = string.replace(/[^0-9]/g,'');
   return parseInt(numsStr);
}
    
console.log(justNumbers('abcdefg12hijklmnop'));

Puedes hacer una función como esta

function justNumbers(string) 
    {
        var numsStr = string.replace(/[^0-9]/g,'');
        return parseInt(numsStr);
    }

recuerde: si el número tiene un cero delante de él, el int no lo tendrá

6

Puede extraer números de una cadena usando una expresión regular:

let string = "xxfdx25y93.34xxd73";
let res = string.replace(/\D/g, "");
console.log(res); 

salida: 25933473

Envuélvalo en la función vainilla de JavaScript:

function onlyNumbers(text){
    return text.replace(/\D/g, "");
}
4

Puede utilizar expresiones regulares.

var txt="some text 2";
var numb = txt.match(/\d/g);
alert (numb);

Eso alertará a 2.

1
  • 4
    -1 no se capturarán varios dígitos y para usar una matriz en alerta 4/04/12 a las 1:24
3

Puede usar la biblioteca de cadenas de subrayado de la siguiente manera

var common="#box"
var href="#box1"

_(href).strRight(common)

el resultado será: 1

Ver: https://github.com/epeli/underscore.string

DEMO:
http://jsfiddle.net/abdennour/Vyqtt/
Código HTML:

<p>
    <a href="#box1" >img1</a>
    <a href="#box2" >img2</a>
    <a href="#box3" >img3</a>
    <a href="#box4" >img4</a>
</p>
<div style="font-size:30px"></div>

Código JS:

var comm="#box"
$('a').click(function(){
  $('div').html(_($(this).attr('href')).strRight(comm))})

si tiene el sufijo de la siguiente manera:

href="box1az" 

Puede utilizar la siguiente demostración:

http://jsfiddle.net/abdennour/Vyqtt/1/

function retrieveNumber(all,prefix,suffix){
 var left=_(all).strRight(prefix);
 return _(left).strLeft(suffix);

}
3

Con las expresiones regulares , cómo obtener números de una cadena, por ejemplo:

String myString = "my 2 first gifts were made by my 4 brothers";
myString = myString .replaceAll("\\D+","");
System.out.println("myString : " + myString);

el resultado de myStringes " 24"

puede ver un ejemplo de este código en ejecución aquí: http://ideone.com/iOCf5G

1
  • 6
    java! == javascript - replaceAll no existe en javascript estándar. Solo algunas bibliotecas como jQuery tienen ese método. En el futuro, debes aclarar. 12 de agosto de 2015 a las 8:59
3

Aquí tienes un solt. que verifica que no haya datos

var someStr = 'abc'; // add 123 to string to see inverse

var thenum = someStr.match(/\d+/);

if (thenum != null )
{
    console.log(thenum[0]);
}
else
{
 console.log('no number');
}
3

Si alguien necesita conservar puntos en números extraídos:

var some = '65,87 EUR';
var number = some.replace(",",".").replace(/[^0-9&.]/g,'');
console.log(number); // returns 65.87
2

Utilice este código de una línea para obtener el primer número de una cadena sin obtener errores:

var myInt = parseInt(myString.replace(/^[^0-9]+/, ''), 10);
2

por favor verifique a continuación javaScripts, allí puede obtener solo el número

var txt = "abc1234char5678#!9";
var str = txt.match(/\d+/g, "")+'';
var s = str.split(',').join('');
alert(Number(s));

producción : 1234567789

2

Si desea analizar un número a partir de un precio como $ 6,694.20.
Se puede hacer de esta manera:

parseFloat('$6,694.20'.replace( /^\D|,+/g, ''))

o mediante la función:

function parsePrice(value) {
  return parseFloat(value.replace( /^\D|,+/g, ''))
}
parsePrice('$6,694.20') // 6694.2
1
var elValue     = "-12,erer3  4,-990.234sdsd";

var isNegetive = false;
if(elValue.indexOf("-")==0) isNegetive=true;

elValue     = elValue.replace( /[^\d\.]*/g, '');
elValue     = isNaN(Number(elValue)) ? 0 : Number(elValue);

if(isNegetive) elValue = 0 - elValue;

alert(elValue); //-1234990.234
1
  • Ad una explicación. Por ejemplo, por qué usa, a saber, esta expresión regular. 16/06/19 a las 10:00
1

Esta respuesta cubrirá la mayor parte del escenario. Puedo superar esta situación cuando el usuario intenta copiar y pegar el número de teléfono

  $('#help_number').keyup(function(){
    $(this).val().match(/\d+/g).join("")
  });

Explicación:

str= "34%^gd 5-67 6-6ds"

str.match(/\d+/g)

It will give a array of string as output >> ["34", "56766"]

str.match(/\d+/g).join("")

join convertirá y concatenará los datos de la matriz en una sola cadena

output >> "3456766"

In my example I need the output as 209-356-6788 so I used replace

  $('#help_number').keyup(function(){
    $(this).val($(this).val().match(/\d+/g).join("").replace(/(\d{3})\-?(\d{3})\-?(\d{4})/,'$1-$2-$3'))
  });
1

Necesita agregar "(/ \ d + / g)" que eliminará todo el texto que no sea numérico, pero seguirá siendo una cadena en este punto. Si crea una variable y "parseInt" a través de la coincidencia, puede establecer las nuevas variables en los valores de la matriz. Aquí hay un ejemplo de cómo lo hice funcionar:

    var color = $( this ).css( "background-color" );
    var r = parseInt(color.match(/\d+/g)[0]);
    var g = parseInt(color.match(/\d+/g)[1]);
    var b = parseInt(color.match(/\d+/g)[2]);
1
  • ¡Hola! Esta pregunta ya tiene una respuesta aceptada. Antes de pasar a las preguntas contestadas, por favor considerar la búsqueda de los sin respuesta en primer lugar. Sin embargo, si tiene algo que agregar a una pregunta respondida, considere leer las otras respuestas detenidamente primero.
    PajLe
    8 de julio de 2020 a las 2:33
0
changeStrangeDate(dateString: string) {
var sum = 0;
var numbers = dateString.match(/\d+/g);
if (numbers.length > 1) {
  numbers.forEach(element => {
    sum += parseInt(element);
  }
  );
}
console.log(new Date(sum).toDateString());
return new Date(sum).toUTCString();

}

Puede hacerlo así y luego llamar a la función donde lo necesite, con parámetro.

this.changeStrangeDate('/Date(1551401820000-0100)/');
0

encontrar todos los números de una cadena usando exp regular

ingrese la descripción de la imagen aquí

1
  • por favor publique su código y formatéelo en lugar de usar una imagen 12 de julio a las 9:28