@ Thomas: Ten kod nie działa, wynika z b == "System.Linq.Enumerable..". Prawidłowe (a nawet prostsze) byłobyb = String.Join("", a.Where(char.IsDigit))
BlueRaja - Danny Pflughoeft
1
Dobrze, że nauczy mnie to nie testować kodu, który piszę w komentarzu! Możesz również utworzyć ciąg z tablicy char za pomocą new string(char[])konstruktora.
Thomas
1
Regex wykonuje znacznie lepszą pracę.
Jason Kelley,
@BlueRaja - Danny Pflughoeft Dlaczego nie poprawisz komentarza, abym mógł głosować :-)
SteveC
UWAGA: Jeśli ciąg znaków zawiera wiele liczb, ta odpowiedź spowoduje, że wszystkie zostaną połączone razem w jedną liczbę. Np. „A12bcd345” powoduje „12345”. (Które może być pożądane lub nie, w zależności od celu.) Jest to inne niż najlepiej głosowane rozwiązanie Regex, które w przypadku powyżej zwróci „12”. Ma to znaczenie w przypadkach takich jak numery telefonów „555-111-2222”.
ToolmakerSteve
546
\d+jest wyrażeniem regularnym liczby całkowitej. Więc
do obsługi liczb ujemnych można użyć Regex.Match(subjectString, @"-?\d+").Valuezamiast tego
Jon List
45
Ta odpowiedź nie jest kompletna (w języku C #). Pobiera tylko pierwszą liczbę w ciągu. Musisz itarować nad dopasowaniami: resultString = string.Join (string.Empty, Regex.Matches (subjectString, @ "\ d +"). OfType <Match> () .Select (m => m.Value));
Markus
8
@Markus: Państwa pytanie „I trzeba wyodrębnić numer zawarty wewnątrz łańcucha”, a wszystkie przykłady pokazują jeden numer jest obecny w ciągu. Iterowanie po jednym elemencie nie jest przydatne.
Tim Pietzcker
2
@ ayman: Och, przecinki to tysiące separatorów? Będzie to wymagało znacznie bardziej złożonego wyrażenia regularnego - na co należy odpowiedzieć w osobnym pytaniu. Doskonałym punktem wyjścia jest Regular-Expressions.info, który zawiera również sekcje dotyczące silnika wyrażeń regularnych .NET.
Tim Pietzcker,
5
@DavidSopko: O czym ty mówisz? Pierwotne pytanie dotyczyło sposobu wyodrębnienia pojedynczej liczby z ciągu zarówno w tytule, jak i w treści pytania. Kolejne zmiany w pytaniu (rok po mojej odpowiedzi i później) przez osoby inne niż oryginalny autor zmieniły tytuł na „liczby”. Jeśli cokolwiek, ta błędna edycja powinna zostać wycofana.
Tim Pietzcker,
180
Oto jak oczyszczam numery telefonów, aby uzyskać tylko cyfry:
bardzo eleganckie rozwiązanie .. Lubię użycie linq
Leo Gurdian
1
Ładne rozwiązanie dla liczb całkowitych! Pamiętaj, że to nie zadziała, jeśli spróbujesz parsować liczbę dziesiętną, ponieważ przecinek dziesiętny nie jest cyfrą.
Elijah Lofgren
40
użyj wyrażenia regularnego ...
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 może wyodrębniać liczby z ciągów. Otrzymasz wszystkie liczby znalezione w ciągu.
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);}}
To najlepsza odpowiedź, która dała mi to, czego chciałem, czyli tablicę wielu liczb w ciągu. Gdyby tylko mógł zignorować przecinki w liczbach (separator tysięcy), byłoby to idealne! :-)
Sagar,
9
Możesz to zrobić za pomocą Stringwłaściwości takich jak poniżej:
Pytanie nie mówi wprost, że chcesz tylko znaków od 0 do 9, ale nie byłoby łatwo uwierzyć, że to prawda z twojego zestawu przykładów i komentarzy. Oto kod, który to robi.
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;}
Dlaczego nie chcesz używać Char.IsDigit () - Liczby obejmują znaki, takie jak ułamki, indeksy dolne, indeks górny, cyfry rzymskie, liczniki walut, liczby otoczone i cyfry specyficzne dla skryptu.
// 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);
Ten kod służy do znajdowania wszystkich wartości całkowitych w ciągu.
Manoj Gupta
Lepiej byłoby dodać opis bezpośrednio do odpowiedzi, niż opublikować go osobno jako komentarz. Komentarze nie zawsze są natychmiast widoczne.
John Dvorak
2
Interesujące podejście zapewnia tutaj Ahmad Mageed, wykorzystuje Regex i program budujący ciągi, aby wyodrębnić liczby całkowite w kolejności, w jakiej występują w ciągu.
Przykład użycia Regex.Split na podstawie postu Ahmada Mageeda jest następujący:
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
? Notacja wykładnicza jak1.5E45
?Odpowiedzi:
przejdź przez ciąg i użyj
Char.IsDigit
źródło
b == "System.Linq.Enumerable.."
. Prawidłowe (a nawet prostsze) byłobyb = String.Join("", a.Where(char.IsDigit))
new string(char[])
konstruktora.\d+
jest wyrażeniem regularnym liczby całkowitej. Więczwraca ciąg zawierający pierwsze wystąpienie liczby w
subjectString
.Int32.Parse(resultString)
poda ci numer.źródło
Regex.Match(subjectString, @"-?\d+").Value
zamiast tegoOto jak oczyszczam numery telefonów, aby uzyskać tylko cyfry:
źródło
string numericPhone =new String(phone.Where(Char.IsDigit).ToArray());
użyj wyrażenia regularnego ...
źródło
Czego używam, aby uzyskać numery telefonów bez interpunkcji ...
źródło
Regex.Split może wyodrębniać liczby z ciągów. Otrzymasz wszystkie liczby znalezione w ciągu.
Wynik:
źródło
Oto
Linq
wersja:źródło
"123iuow45ss".AsEnumerable().Where(char.IsDigit)
?from t .. select t
redundancji, ale i tak na zdrowie.Kolejne proste rozwiązanie wykorzystujące Regex Powinieneś tego użyć
a kod to
źródło
Możesz także spróbować tego
źródło
Wystarczy użyć RegEx, aby dopasować ciąg, a następnie przekonwertować:
źródło
Oto inne
Linq
podejście, które wyodrębnia pierwszą liczbę z ciągu.Przykłady:
źródło
Dla tych, którzy chcą liczb dziesiętnych z ciągu z wyrażeniem regularnym w DWÓCH wierszach:
To samo dotyczy pływaka , długiego itp.
źródło
źródło
Możesz to zrobić za pomocą
String
właściwości takich jak poniżej:która daje tylko liczbę z ciągu.
źródło
źródło
Pytanie nie mówi wprost, że chcesz tylko znaków od 0 do 9, ale nie byłoby łatwo uwierzyć, że to prawda z twojego zestawu przykładów i komentarzy. Oto kod, który to robi.
Dlaczego nie chcesz używać Char.IsDigit () - Liczby obejmują znaki, takie jak ułamki, indeksy dolne, indeks górny, cyfry rzymskie, liczniki walut, liczby otoczone i cyfry specyficzne dla skryptu.
źródło
Zbierz wszystkie liczby z ciągu. Więc jeśli użyjesz dla przykładu „1 plus 2”, otrzyma „12”.
źródło
Metoda rozszerzenia, aby uzyskać wszystkie liczby dodatnie zawarte w ciągu:
Jeśli chcesz również liczb ujemnych, po prostu zmodyfikuj ten kod, aby obsługiwał znak minus (
-
)Biorąc pod uwagę ten wkład:
Wynikowa lista numerów będzie:
źródło
jeśli liczba ma kropki dziesiętne, możesz użyć poniżej
wyniki:
Przykład: https://dotnetfiddle.net/IrtqVt
źródło
Czy na odwrocie jednej z odpowiedzi na to pytanie: Jak usunąć liczby z łańcucha przy użyciu Regex.Replace?
źródło
źródło
Interesujące podejście zapewnia tutaj Ahmad Mageed, wykorzystuje Regex i program budujący ciągi, aby wyodrębnić liczby całkowite w kolejności, w jakiej występują w ciągu.
Przykład użycia Regex.Split na podstawie postu Ahmada Mageeda jest następujący:
źródło
Oto mój algorytm
źródło
oto moje rozwiązanie
źródło
Będziesz musiał użyć Regex jako
\d+
\d
dopasowuje cyfry w podanym ciągu.źródło
źródło
źródło
Korzystając z odpowiedzi @ tim-pietzcker z góry , następujące będą działać dla
PowerShell
.źródło
Na podstawie ostatniej próbki stworzyłem metodę:
źródło