2012-04-30 17 views
9

Buscando maneras rápidas/eficientes de convertir un número alfanumérico a un número únicoAlfanumérico a numérico solamente

p. + 123-456/7890 se convierte 1234567890 etc.

el código existente es

foreach(char c in str.ToCharArray()) 
    if (char.IsDigit(c)) stringBuilder.Append(c); 

return stringBuilder.ToString(); 
+0

¿En qué estás realmente? ... ¿nuevas ideas (por ejemplo, uso de expresiones regulares) o puntos de referencia? ¿Por qué estás haciendo esta pregunta, solo por información, o hay un escenario en el mundo real? –

+0

No creo que su enfoque sea lento ... si mida en velocidad, debería ser mucho más rápido que la expresión regular. La única mejora que puedo imaginar es reemplazar con Linq, pero no con la velocidad, solo un código más limpio. – xandy

+1

Duplicado de http://stackoverflow.com/questions/6361986/how-get-integer-only-and-remove-all-string-in-c-sharp –

Respuesta

4

LINQ Solución:

return new string(str.Where(char.IsDigit).ToArray()); 

No estoy seguro de si es más eficiente; al menos no es regex!

4
string str="+123-456/7890"; 
long onlyNumbers= Convert.ToInt64(Regex.Replace(str, @"\D", "")); 
+0

¿Cómo la expresión regular es más rápida? –

+1

@Kumar: Y si su número va más allá de 'Int32.MaxValue = 2147483647', use Convert.ToInt64 (...); que puede darte resultados hasta 'Int64.MaxValue = 9223372036854775807' – Marshal

+0

Gracias @Marshal, he editado mi respuesta. –

2

Sí RegEx es más rápido entre otros, se puede hacer la comparación aún más rápido usando RegexOptions.Compiled a relacione los casos negativo/positivo y resérvelos aparte (si tales cadenas pueden existir)

por ej.

Regex numberOnlyRegEx = new Regex(@"[^0-9]+", RegexOptions.Compiled); 

if (!numberOnlyRegEx.IsMatch(str)) 
    return 0; //default value; 

return Convert.ToInt32(numberOnlyRegEx .Replace(str, "[^0-9]+", "")); 
+0

Lo probé utilizando Ideone, que da resultados completamente inversos y ahora la pregunta sería ¿en qué confiar VS-IDE o Ideone? – Marshal

+0

@Marshal, eso es extraño, creo más en los resultados de VS-IDE que en su máquina local, pero no puedo decirlo tan pronto. –

2

Aquí es una solución encontró otra

string justNumbers = new String(text.Where(Char.IsDigit).ToArray()); 
int numbers = Convert.ToInt32(justNumbers); 
+0

Este proceso es mucho más lento (4 ms) en comparación con las comparaciones Regex (1 ms). Aunque puede que no dañe demasiado a la aplicación, (era solo una pequeña 'investigación') – Marshal

1

Después de ver muchas respuestas que intentan no usar Regex en esta situación, me gustaría decir que en realidad Regex funciona mucho más rápido en este caso particular. Traté de tiempo necesario para la ejecución utilizando this code snippet

método sugerido por

Editar: Estos dan dos salidas completamente opuestos, que no sé si deberíamos Ideone por completo la confianza de IDE de Visual Studio.

+0

Marshal, coloque su código en [IDEone] (http://ideone.com/tH4O4), actualmente no tengo nada para probar, pero este lugar puede ser aceptable para los dos. –

+0

@SaeedAmiri: De acuerdo, trataré de encontrar eso también :) – Marshal

+0

Marshal, simplemente escriba ideone.com luego publique su código dentro de él, y deje el enlace relacionado aquí. –

Cuestiones relacionadas