@Thomas: Ce code ne fonctionne pas, il en résulte b == "System.Linq.Enumerable..". Correct (et encore plus simple) seraitb = String.Join("", a.Where(char.IsDigit))
BlueRaja - Danny Pflughoeft
1
Bon point, ça va m'apprendre à ne pas tester le code que j'écris en commentaire! Vous pouvez également créer une chaîne à partir d'un tableau de caractères à l'aide du new string(char[])constructeur.
Thomas
1
Regex fait un bien meilleur travail.
Jason Kelley
@BlueRaja - Danny Pflughoeft Pourquoi ne pas faire de votre commentaire une bonne réponse pour que je puisse voter :-)
SteveC
REMARQUE: si la chaîne contient plusieurs nombres, cette réponse les exécutera tous ensemble en un seul numéro. Par exemple, "a12bcd345" donne "12345". (Ce qui peut être souhaitable ou non, selon l'objectif.) C'est différent de la solution Regex la mieux votée, qui retournerait "12" pour le cas ci-dessus. Cela est important pour des cas comme les numéros de téléphone "555-111-2222".
ToolmakerSteve
546
\d+est l'expression rationnelle d'un nombre entier. Alors
pour prendre en charge les nombres négatifs que vous pourriez utiliser à la Regex.Match(subjectString, @"-?\d+").Valueplace
Jon List
45
Cette réponse n'est pas complète (en C #). Il obtient uniquement le premier nombre de la chaîne. Vous devez différencier les correspondances: resultString = string.Join (string.Empty, Regex.Matches (subjectString, @ "\ d +"). OfType <Match> () .Select (m => m.Value));
Markus
8
@Markus: La question indique "J'ai besoin d'extraire un nombre contenu dans une chaîne", et tous les exemples montrent qu'un seul nombre est présent dans la chaîne. Itérer sur un seul élément n'est pas utile.
Tim Pietzcker
2
@ayman: Oh, les virgules sont des milliers de séparateurs? Cela nécessitera une expression beaucoup plus complexe - qui devrait être traitée dans une question distincte. Un excellent point de départ est Regular-Expressions.info qui contient également des sections sur le moteur d'expression régulière de .NET.
Tim Pietzcker
5
@DavidSopko: De quoi tu parles? La question d'origine demandait un moyen d'extraire un seul numéro d'une chaîne, à la fois dans le titre et dans le corps de la question. Des modifications ultérieures de la question (un an après ma réponse et plus tard) par des personnes autres que l'auteur d'origine ont changé le titre en "nombres". Si quelque chose, cette modification défectueuse doit être annulée.
Tim Pietzcker
181
Voici comment je nettoie les numéros de téléphone pour obtenir uniquement les chiffres:
solution très élégante .. J'aime l'utilisation de linq
Leo Gurdian
1
Belle solution pour les entiers! Sachez que cela ne fonctionnera pas si vous essayez d'analyser un nombre décimal car le point décimal n'est pas un chiffre.
Elijah Lofgren
40
utiliser une expression régulière ...
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 peut extraire des nombres des chaînes. Vous obtenez tous les nombres qui se trouvent dans une chaîne.
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);}}
sympa mais si vous avez des espaces entre les nombres dans la chaîne d'origine, cela vous donnera 1 grande chaîne concaténée avec les deux nombres joints (pas d'espace)
Mohammad Zekrallah
11
Utilisez simplement un RegEx pour faire correspondre la chaîne, puis convertissez:
Match match =Regex.Match(test ,@"(\d+)");if(match.Success){returnint.Parse(match.Groups[1].Value);}
C'est la meilleure réponse qui m'a donné ce que je voulais, qui est un tableau de plusieurs nombres dans la chaîne. Si seulement il pouvait ignorer les virgules en nombre (milliers de séparateurs), ce serait parfait! :-)
Sagar
9
Vous pouvez le faire en utilisant une Stringpropriété comme ci-dessous:
La question n'indique pas explicitement que vous voulez juste les caractères 0 à 9, mais ce ne serait pas exagéré de croire que c'est vrai à partir de votre exemple et de vos commentaires. Voici donc le code qui fait cela.
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;}
Pourquoi vous ne voulez pas utiliser Char.IsDigit () - Les nombres incluent des caractères tels que des fractions, des indices, des exposants, des chiffres romains, des numérateurs de devises, des nombres encerclés et des chiffres spécifiques au script.
// 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);
Ce code est utilisé pour rechercher toutes les valeurs entières dans une chaîne.
Manoj Gupta
Il serait préférable d'ajouter une description directement dans la réponse plutôt que de la poster séparément en tant que commentaire. Les commentaires ne sont pas toujours immédiatement visibles.
John Dvorak
2
Une approche intéressante est fournie ici par Ahmad Mageed, utilise Regex et stringbuilder pour extraire les entiers dans l'ordre dans lequel ils apparaissent dans la chaîne.
Un exemple utilisant Regex.Split basé sur le post d'Ahmad Mageed est le suivant:
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
? Notation exponentielle comme1.5E45
?Réponses:
passer par la chaîne et utiliser
Char.IsDigit
la source
b == "System.Linq.Enumerable.."
. Correct (et encore plus simple) seraitb = String.Join("", a.Where(char.IsDigit))
new string(char[])
constructeur.\d+
est l'expression rationnelle d'un nombre entier. Alorsrenvoie une chaîne contenant la première occurrence d'un nombre dans
subjectString
.Int32.Parse(resultString)
vous donnera alors le numéro.la source
Regex.Match(subjectString, @"-?\d+").Value
placeVoici comment je nettoie les numéros de téléphone pour obtenir uniquement les chiffres:
la source
string numericPhone =new String(phone.Where(Char.IsDigit).ToArray());
utiliser une expression régulière ...
la source
Ce que j'utilise pour obtenir des numéros de téléphone sans aucune ponctuation ...
la source
Regex.Split peut extraire des nombres des chaînes. Vous obtenez tous les nombres qui se trouvent dans une chaîne.
Production:
la source
Voici une
Linq
version:la source
"123iuow45ss".AsEnumerable().Where(char.IsDigit)
?from t .. select t
redondance, mais de toute façon, applaudissements.Une autre solution simple utilisant Regex Vous devriez avoir besoin d'utiliser ceci
et le code est
la source
Vous pouvez également essayer ceci
la source
Utilisez simplement un RegEx pour faire correspondre la chaîne, puis convertissez:
la source
Voici une autre
Linq
approche qui extrait le premier nombre d'une chaîne.Exemples:
la source
Pour ceux qui veulent un nombre décimal à partir d'une chaîne avec Regex en DEUX lignes:
La même chose s'applique au flotteur , long , etc ...
la source
la source
Vous pouvez le faire en utilisant une
String
propriété comme ci-dessous:qui ne donne que le nombre de la chaîne.
la source
la source
La question n'indique pas explicitement que vous voulez juste les caractères 0 à 9, mais ce ne serait pas exagéré de croire que c'est vrai à partir de votre exemple et de vos commentaires. Voici donc le code qui fait cela.
Pourquoi vous ne voulez pas utiliser Char.IsDigit () - Les nombres incluent des caractères tels que des fractions, des indices, des exposants, des chiffres romains, des numérateurs de devises, des nombres encerclés et des chiffres spécifiques au script.
la source
Obtenez tous les nombres dans la chaîne. Donc, si vous utilisez par exemple «1 plus 2», vous obtiendrez «12».
la source
Méthode d'extension pour obtenir tous les nombres positifs contenus dans une chaîne:
Si vous voulez également des nombres négatifs, modifiez simplement ce code pour gérer le signe moins (
-
)Compte tenu de cette entrée:
La liste de numéros obtenue sera:
la source
si le nombre a un point décimal, vous pouvez utiliser ci-dessous
résultats :
Exemple: https://dotnetfiddle.net/IrtqVt
la source
Est-ce que l'inverse de l'une des réponses à cette question: Comment supprimer des nombres de la chaîne en utilisant Regex.Replace?
la source
la source
Une approche intéressante est fournie ici par Ahmad Mageed, utilise Regex et stringbuilder pour extraire les entiers dans l'ordre dans lequel ils apparaissent dans la chaîne.
Un exemple utilisant Regex.Split basé sur le post d'Ahmad Mageed est le suivant:
la source
Voici mon algorithme
la source
voici ma solution
la source
Vous devrez utiliser Regex comme
\d+
\d
correspond aux chiffres de la chaîne donnée.la source
la source
la source
En utilisant la réponse @ tim-pietzcker ci - dessus , ce qui suit fonctionnera
PowerShell
.la source
Sur la base du dernier échantillon, j'ai créé une méthode:
la source