Extraiga números de la cadena para crear una cadena de solo dígitos [duplicado]

Me han dado algunos datos mal formateados y necesito sacar números de las cadenas. No estoy seguro de cuál es la mejor manera de hacer esto. Los números pueden tener cualquier longitud.

string a = "557222]]>";
string b = "5100870<br>";

alguna idea de lo que puedo hacer, así que conseguiré esto:

a = "557222"
b = "5100870"

Muchas Gracias

La solución es para C# lo siento. Edité la pregunta para tener esa etiqueta.

preguntado el 12 de junio de 12 a las 19:06

¿Puede haber "datos incorrectos" en medio de su número? -

No, solo será en los extremos. -

8 Respuestas

Puede escribir un método simple para extraer todos los caracteres que no sean dígitos, aunque esto no manejará los datos de punto flotante:

public string ExtractNumber(string original)
{
     return new string(original.Where(c => Char.IsDigit(c)).ToArray());
}

Esto simplemente extrae los "dígitos"; también podría usar Char.IsNumber en lugar de Char.IsDigit, dependiendo del resultado que desee.

Respondido el 12 de junio de 12 a las 19:06

IsDigit saca lo siguiente; fracciones, subíndices, superíndices, números romanos, numeradores de moneda, números encerrados y dígitos específicos de escritura. Es posible que le esté dando a alguien la impresión de que "simplemente saca los dígitos". Vea mi respuesta para obtener solo los caracteres 0-9. - Atters

Puede ser incluso más corto como public static string ExtractNumber(string original) => new string(original.Where(char.IsDigit).ToArray()); :) - Patrick

Prueba este oneliner:

Regex.Replace(str, "[^0-9 _]", "");

Respondido 06 Abr '20, 18:04

Eso no funciona para los números de punto flotante, ya que elimina el punto y el signo negativo. - Kamran Bigdely

No estoy lo suficientemente familiarizado con .NET para el código exacto. Sin embargo, dos enfoques serían:

  • Transmítelo como un número entero. Si los caracteres que no son dígitos están al final (es decir, 21389abc), este es el más fácil.
  • Si ha entremezclado caracteres que no son dígitos (es decir, 1231a23v) y quiero mantener cada dígito, use la expresión regular [^\d] para reemplazar caracteres que no sean dígitos.

Respondido el 12 de junio de 12 a las 19:06

+1 para la expresión regular. Con C# podrías usar algo como, Regex.split(str, "[^\d]") y utilice el string.join("", Regex.split(...)) función. - Ryan

@Ryan, gracias. Nunca profundicé demasiado en .NET. Pero la lógica trasciende el lenguaje :) - Jason McCreary

En lugar del lío de dividir/unir, una solución más simple es: new Regex(@"\D").Replace(source ?? "", ""); - k kimble

Puede usar una expresión regular simple:

var numericPart = Regex.Match( a, "\\d+" ).Value;

Si necesita que sea un valor numérico real, puede usar int.Parse or int.TryParse.

Respondido el 12 de junio de 12 a las 19:06

Podrías usar LINQ. El siguiente código filtra la cadena en un IEnumerable con solo dígitos y luego la convierte en char[]. El constructor de cadenas puede convertir char[] en una cadena:

string a = "557222]]>";
string b = "5100870<br>";

a = new string(a.Where(x => char.IsDigit(x)).ToArray());
b = new string(b.Where(x => char.IsDigit(x)).ToArray());

Respondido 17 Feb 17, 22:02

La pregunta no establece explícitamente que solo desea los caracteres del 0 al 9, pero no sería exagerado creer que eso es cierto a partir de su conjunto de ejemplos y comentarios. Así que aquí está el código que hace eso.

        string digitsOnly = String.Empty;
        foreach (char c in s)
        {
            // Do not use IsDigit as it will include more than the characters 0 through to 9
            if (c >= '0' && c <= '9') digitsOnly += c;
        }

Por qué no desea utilizar Char.IsDigit (): los números incluyen caracteres como fracciones, subíndices, superíndices, números romanos, numeradores de moneda, números rodeados por un círculo y dígitos específicos del script.

Respondido el 18 de enero de 15 a las 18:01

Prueba esta

string number = Regex.Match("12345<br>", @"\d+").Value;

Esto devolverá el primer grupo de dígitos. Ejemplo: para la entrada "a 123 b 456 c" volverá "123".

Respondido 30 Abr '15, 14:04

Aquí está la versión que funcionó para mi caso

    public static string ExtractNumbers(this string source)
    {
        if (String.IsNullOrWhiteSpace(source))
            return string.Empty;
        var number = Regex.Match(source, @"\d+");
        if (number != null)
            return number.Value;
        else
            return string.Empty;
    }

contestado el 02 de mayo de 18 a las 09:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.