Extraer ("obtener") un número de una cadena

355

Tengo una cadena en javascript como '# box2' y solo quiero el '2' de ella.

Intentó:

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

Todavía devuelve # box2 en la alerta, ¿cómo puedo hacer que funcione?

Necesita acomodar cualquier número de longitud adjunto al final.

usuario1022585
fuente
1
simplemente puedes hacer así. Funcionará bien. var thestring = $ (this) .attr ('href'); var thenum = parsefloat (thestring); alerta (thenum);
Vivek Shukla
1
este código funciona bien para mí, pero para un caso, tengo una cadena '2.5 / milla' y quiero extraer 2.5 de esto. El código anterior me da 25 en lugar de 2.5
Bijay Singh
1
Relacionado: stackoverflow.com/q/1862130/1066234
Kai Noack el

Respuestas:

578

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>

georg
fuente
15
-1, "#box2_col3".replace( /^\D+/g, '')debería haber mostrado 2, no 2_col3.
Shiplu Mokaddim
2
@ shiplu.mokadd.im: No veo ninguna referencia #box2_col3en la pregunta.
georg
1
Sí, no hay referencia de #box2_col3. Pero vea el OP regex utilizado ( \w)(.+$)) que indica claramente que hay otros caracteres después del número.
Shiplu Mokaddim
3
en ese caso, su patrón también falla si hay un número antes del final.
Shiplu Mokaddim
2
Puede replacetrabajar con números theString.replace(/^.*\D+/g, '');iniciales usando:, pero la solución de shiplu.mokadd.im es mejor.
LandonSchropp
225

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
Jason Marshall
fuente
1
buena respuesta, pero ¿y si quiero el conjunto de números por separado? es decir, 1234, 5616133 ...
Amar Singh el
O one-liner + parsing to integer:parseInt(txt.match(/\d/g).join(''), 10)
Lukas Liesis
" $ 20.0 ".match(/\d/g).join('') => "200" (solo diciendo)
vsync
91

Creo que esta expresión regular 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,'');
Theodoros Klikas
fuente
1
/[^0-9]/g+1 para legibilidad. También se usa con la mayoría de las respuestas aquí: stackoverflow.com/q/1862130/1066234
Kai Noack
58

Pruebe 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, ''));

xbalaji
fuente
2
Esto es mejor que la respuesta aceptada, ya que reemplaza todos los no números a nivel mundial y, por cierto, /[^0-9]/gpuede reemplazarse por /[^\d]/g.
CPHPython
52

Usando la función de coincidencia.

var thenum = thestring.match(/\d+$/)[0];
alert(thenum);

jsfiddle

Shiplu Mokaddim
fuente
1
También puede agregar '+' unario para que sea entero var thenum = + thestring.match (/ \ d + $ /) [0];
Sergey Onishchenko
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 buscando números posibles> 10.)
Felix
@nissemand Dont supongo . Pruébalo tú mismo. Incluso tú no viste el violín.
Shiplu Mokaddim
Me gusta esto. Una forma más simple de extraer el número en una variable sin tocar o modificar el elemento. Agradecería un combo con cada uno para múltiples coincidencias dentro de una cadena. es decir, la cadena 12a55 informa el último número, no todos.
m3nda
1
@YevgeniyAfanasyev no debería. Revisa la pregunta original. Especialmente la última línea. El número debe estar al final.
Shiplu Mokaddim
33

Intenté 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 atributo, pero lo que sea, la solución es mejor, porque es más completa.

Paulo Roberto Rosa
fuente
Creo que mejor será str.match(/\d+/g).map(Number)que devolverá una matriz
Artem Bernatskyi
33

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

var price = "£1,739.12";
parseFloat(price.replace( /[^\d\.]*/g, '')); // 1739.12
Lacho Tomov
fuente
13

puede usar un excelente método parseInt

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

parseInt("-10px");
// will give you -10
Eugene Tiurin
fuente
18
esto solo funciona cuando el número está al comienzo de la cadena
Russj
2
su regreso NaN
Ahmed Syed
7

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

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

jsFiddle:

icyrock.com
fuente
4

Puedes usar expresiones regulares.

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

Eso alertará 2.

Robby Shaw
fuente
44
-1 dígitos múltiples no serán capturados y para usar la matriz en alerta
Shiplu Mokaddim
4

Con 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

Jorgesys
fuente
55
java! == javascript - replaceAll no existe en javascript estándar. Solo algunas bibliotecas como jQuery tienen ese método. En el futuro, debes aclarar.
Levi Roberts
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 siguiente:

href="box1az" 

Puedes usar la siguiente demostración:

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

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

}
Abdennour TOUMI
fuente
3

Aquí hay un solt. que verifica si no hay 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');
}
Gene Bo
fuente
2

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

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

por favor verifique abajo javaScripts, allí solo puede obtener el número

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

salida: 1234567789

Thilina Sampath
fuente
2

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

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

salida: 25933473

Cassio Seffrin
fuente
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
Manoj Chavanke
fuente
Ad una explicación. Por ejemplo, ¿por qué usas esta expresión regular?
mentallurg
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)

Le dará una serie de cadenas como salida >> ["34", "56766"]

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

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

salida >> "3456766"

En mi ejemplo, necesito la salida como 209-356-6788, así que usé reemplazar

  $('#help_number').keyup(function(){
    $(this).val($(this).val().match(/\d+/g).join("").replace(/(\d{3})\-?(\d{3})\-?(\d{4})/,'$1-$2-$3'))
  });
Vinay Kumar
fuente
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 el parámetro.

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

Puedes hacer una función como esta

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