Extraiga números de la cadena para crear una cadena de solo dígitos [duplicado]
Frecuentes
Visto 56,128 veces
12
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.
8 Respuestas
31
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
13
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
8
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
7
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
6
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
4
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
4
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
0
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 c# .net regex string or haz tu propia pregunta.
¿Puede haber "datos incorrectos" en medio de su número? - Reed Copsey
No, solo será en los extremos. - kevp