2012-06-12 69 views
10

Me han proporcionado algunos datos con un formato deficiente 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 ser de cualquier longitud.Extraer números de la cadena para crear cadena de solo dígitos

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

alguna idea de lo que yo puedo hacer lo que voy a conseguir esto:

a = "557222" 
b = "5100870" 

Gracias

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

+0

¿Se refiere a C o C#? –

+0

¿Puede "datos incorrectos" estar en el medio de su número? –

+0

No, solo estará en los extremos. – kevp

Respuesta

8

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

  • Colóquelo 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 desea mantener cada dígito, utilice la expresión regular [^\d] para reemplazar caracteres que no sean dígitos.
+2

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

+0

@Ryan, gracias. Nunca llegué demasiado profundo en .NET. Pero la lógica trasciende el lenguaje :) –

+2

En lugar del desorden de división/unión, una solución más simple es: nueva Regex (@ "\ D"). Reemplazar (fuente ?? "", ""); –

29

Se puede escribir un método simple para extraer a cabo todos los caracteres que no sean dígitos, aunque esto no se encargará de datos de punto flotante:

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

Este puramente saca los "dígitos" - que también podría use Char.IsNumber en lugar de Char.IsDigit, dependiendo del resultado que desee.

+0

IsDigit extrae lo siguiente; fracciones, subíndices, superíndices, números romanos, numeradores de monedas, números encerrados y dígitos específicos del guión. Usted puede estar dando la impresión a alguien al afirmar que "saca los dígitos". Vea mi respuesta para obtener solo los caracteres 0-9. – Atters

7

Se puede utilizar una expresión regular simple:

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

Si necesita que sea un valor numérico real, a continuación, puede utilizar int.Parse o int.TryParse.

3

probar este

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" devolverá "123".

3

La pregunta no indica explícitamente que solo desea los caracteres del 0 al 9, pero no sería exagerado creer que es cierto a partir de su conjunto de ejemplos y comentarios. Entonces 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é usted no desea utilizar Char.IsDigit() - Las cifras incluyen caracteres tales como fracciones, subíndices, superíndices, números romanos, numeradores de moneda, números de cercado, y dígitos en secuencias de comandos específicos.

10

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

+0

Eso no funciona para los números de punto flotante ya que elimina el punto y el signo negativo. –

4

Puede usar LINQ. El siguiente código filtra la cadena en un IEnumerable con solo dígitos y luego lo convierte en un char []. El constructor de cadenas puede convertir el carácter [] 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()); 
Cuestiones relacionadas