@Thomas: Ese código no funciona, resulta con b == "System.Linq.Enumerable..". Correcto (e incluso más simple) seríab = String.Join("", a.Where(char.IsDigit))
BlueRaja - Danny Pflughoeft
1
Buen punto, ¡eso me enseñará a no probar el código que escribo en el comentario! También puede hacer una cadena de una matriz de caracteres utilizando el new string(char[])constructor.
Thomas
1
Regex hace un trabajo mucho mejor.
Jason Kelley
@BlueRaja - Danny Pflughoeft ¿Por qué no hacer que tu comentario sea una respuesta adecuada para que pueda votarlo
?:
NOTA: Si la cadena contiene varios números, esta respuesta los ejecutará todos juntos en un solo número. Por ejemplo, "a12bcd345" da como resultado "12345". (Lo que puede ser deseable o no, dependiendo del objetivo). Esto es diferente de la solución Regex más votada, que arrojaría "12" para el caso anterior. Esto es importante para casos como los números de teléfono "555-111-2222".
ToolmakerSteve
546
\d+es la expresión regular para un número entero. Entonces
para admitir números negativos que podrías usar Regex.Match(subjectString, @"-?\d+").Valueen su lugar
Jon List
45
Esta respuesta no está completa (en C #). Solo está obteniendo el primer número en la cadena. Debe iterar sobre las coincidencias: resultString = string.Join (string.Empty, Regex.Matches (subjectString, @ "\ d +"). OfType <Match> () .Select (m => m.Value));
Markus
8
@ Markus: La pregunta dice "Necesito extraer un número contenido en una cadena", y todos los ejemplos muestran un solo número presente en la cadena. Iterar sobre un solo elemento no es útil.
Tim Pietzcker
2
@ayman: Oh, ¿las comas son miles de separadores? Eso requerirá una expresión regular mucho más compleja, que debería tratarse en una pregunta separada. Un excelente punto de partida es Regular-Expressions.info, que también contiene secciones en el motor de expresiones regulares de .NET.
Tim Pietzcker
55
@DavidSopko: ¿De qué estás hablando? La pregunta original pedía una forma de extraer un solo número de una cadena, tanto en el título como en el cuerpo de la pregunta. Las ediciones posteriores a la pregunta (un año después de mi respuesta y más tarde) por personas distintas al autor original cambiaron el título a "números". En todo caso, esa edición defectuosa debería revertirse.
Tim Pietzcker
181
Así es como limpio los números de teléfono para obtener solo los dígitos:
¡Buena solución para enteros! Tenga en cuenta que esto no funcionará si está tratando de analizar un número decimal porque el punto decimal no es un dígito.
Elijah Lofgren
40
usar expresiones regulares ...
Regex re =newRegex(@"\d+");Match m = re.Match("test 66");if(m.Success){Console.WriteLine(string.Format("RegEx found "+ m.Value+" at position "+ m.Index.ToString()));}else{Console.WriteLine("You didn't enter a string containing a number!");}
Regex.Split puede extraer números de cadenas. Obtienes todos los números que se encuentran en una cadena.
string input ="There are 4 numbers in this string: 40, 30, and 10.";// Split on one or more non-digit characters.string[] numbers =Regex.Split(input,@"\D+");foreach(stringvaluein numbers){if(!string.IsNullOrEmpty(value)){int i =int.Parse(value);Console.WriteLine("Number: {0}", i);}}
bueno, pero si tienes espacios entre los números en la cadena original, entonces te dará 1 cadena concatenada grande con ambos números unidos (sin espacio)
Mohammad Zekrallah
11
Simplemente use un RegEx para que coincida con la cadena, luego convierta:
Match match =Regex.Match(test ,@"(\d+)");if(match.Success){returnint.Parse(match.Groups[1].Value);}
Esta es la mejor respuesta que me dio lo que quería, que es una matriz de múltiples números dentro de una cadena. Si tan solo pudiera ignorar las comas en números (separador de miles), ¡eso sería perfecto! :-)
Sagar
9
Puede hacer esto usando la Stringpropiedad como a continuación:
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. 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 9if(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 monedas, números encerrados y dígitos específicos de la secuencia de comandos.
Muchas gracias por esta respuesta. Estoy usando C # y VS2017 y estaba tratando de descubrir cómo encuentro el valor. Gracias de nuevo por tu respuesta.
// Pull out only the numbers from the string using LINQvar numbersFromString =newString(input.Where(x => x >='0'&& x <='9').ToArray());var numericVal =Int32.Parse(numbersFromString);
Este código se usa para encontrar todos los valores enteros en una cadena.
Manoj Gupta
Sería mejor agregar alguna descripción directamente en la respuesta que publicarla por separado como comentario. Los comentarios no siempre son visibles de inmediato.
John Dvorak
2
Aquí se proporciona un enfoque interesante por Ahmad Mageed, utiliza expresiones regulares y StringBuilder para extraer los números enteros en el orden en que aparecen en la cadena.
Un ejemplo de uso de Regex.Split basado en la publicación de Ahmad Mageed es el siguiente:
var dateText ="MARCH-14-Tue";string splitPattern =@"[^\d]";string[] result =Regex.Split(dateText, splitPattern);var finalresult =string.Join("", result.Where(e =>!String.IsNullOrEmpty(e)));intDayDateInt=0;int.TryParse(finalresult,outDayDateInt);
//Fast, C Language friendlypublicstaticintGetNumber(stringText){int val =0;for(int i =0; i <Text.Length; i++){char c =Text[i];if(c >='0'&& c <='9'){
val *=10;//(ASCII code reference)
val += c -48;}}return val;}
stringvar="Hello345wor705Ld";string alpha =string.Empty;string numer =string.Empty;foreach(char str invar){if(char.IsDigit(str))
numer += str.ToString();else
alpha += str.ToString();}Console.WriteLine("String is: "+ alpha);Console.WriteLine("Numeric character is: "+ numer);Console.Read();
string s ="kg g L000145.50\r\n";char theCharacter ='.';var getNumbers =(from t in s
wherechar.IsDigit(t)|| t.Equals(theCharacter)select t).ToArray();var _str =string.Empty;foreach(var item in getNumbers){
_str += item.ToString();}double _dou =Convert.ToDouble(_str);MessageBox.Show(_dou.ToString("#,##0.00"));
1.5
? Notación exponencial como1.5E45
?Respuestas:
ir a través de la cuerda y usar
Char.IsDigit
fuente
b == "System.Linq.Enumerable.."
. Correcto (e incluso más simple) seríab = String.Join("", a.Where(char.IsDigit))
new string(char[])
constructor.\d+
es la expresión regular para un número entero. Entoncesdevuelve una cadena que contiene la primera aparición de un número en
subjectString
.Int32.Parse(resultString)
entonces te dará el número.fuente
Regex.Match(subjectString, @"-?\d+").Value
en su lugarAsí es como limpio los números de teléfono para obtener solo los dígitos:
fuente
string numericPhone =new String(phone.Where(Char.IsDigit).ToArray());
usar expresiones regulares ...
fuente
Lo que uso para obtener números de teléfono sin puntuación ...
fuente
Regex.Split puede extraer números de cadenas. Obtienes todos los números que se encuentran en una cadena.
Salida:
fuente
Aquí hay una
Linq
versión:fuente
"123iuow45ss".AsEnumerable().Where(char.IsDigit)
?from t .. select t
redundancia, pero de todos modos, aplausos.Otra solución simple usando Regex Debería necesitar usar esto
y el código es
fuente
también puedes probar esto
fuente
Simplemente use un RegEx para que coincida con la cadena, luego convierta:
fuente
Aquí hay otro
Linq
enfoque que extrae el primer número de una cadena.Ejemplos:
fuente
Para aquellos que desean un número decimal de una cadena con Regex en DOS líneas:
Lo mismo se aplica al flotador , largo , etc.
fuente
fuente
Puede hacer esto usando la
String
propiedad como a continuación:que da solo el número de la cadena.
fuente
fuente
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. Así que aquí está el código que hace eso.
Por qué no desea utilizar Char.IsDigit (): los números incluyen caracteres como fracciones, subíndices, superíndices, números romanos, numeradores de monedas, números encerrados y dígitos específicos de la secuencia de comandos.
fuente
Obtenga todos los números en la cadena. Por lo tanto, si utiliza para examaple '1 plus 2' obtendrá '12'.
fuente
Método de extensión para obtener todos los números positivos contenidos en una cadena:
Si también desea números negativos, simplemente modifique este código para manejar el signo menos (
-
)Dada esta entrada:
La lista de números resultante será:
fuente
si el número tiene puntos decimales, puede usar a continuación
resultados:
Muestra: https://dotnetfiddle.net/IrtqVt
fuente
Hizo el reverso de una de las respuestas a esta pregunta: ¿Cómo eliminar números de la cadena usando Regex.Replace?
fuente
fuente
Aquí se proporciona un enfoque interesante por Ahmad Mageed, utiliza expresiones regulares y StringBuilder para extraer los números enteros en el orden en que aparecen en la cadena.
Un ejemplo de uso de Regex.Split basado en la publicación de Ahmad Mageed es el siguiente:
fuente
Aquí está mi algoritmo
fuente
aqui esta mi solucion
fuente
Tendrás que usar Regex como
\d+
\d
coincide con dígitos en la cadena dada.fuente
fuente
fuente
Usando la respuesta @ tim-pietzcker de arriba , lo siguiente funcionará
PowerShell
.fuente
Basado en la última muestra, creé un método:
fuente