Відповіді:
Існує багато способів, але це має зробити (не знаю, як це працює з дійсно великими рядками):
private static string GetNumbers(string input)
{
return new string(input.Where(c => char.IsDigit(c)).ToArray());
}
IsDigitа не IsNumber: "Цей метод [ IsNumber] визначає, чи Charє будь-яка числова категорія Unicode. Крім включення цифр, цифри включають символи, дроби, підписки, надписи, римські цифри, чисельники валют та обведені цифри. Цей метод контрастує з IsDigitметодом, який визначає, чи a Char- це цифра-10-число ». msdn.microsoft.com/en-us/library/yk2b3t2y.aspx
input.Where(c => char.IsDigit(c) || char.IsWhiteSpace(c))
return new string(input.Where(char.IsDigit).ToArray());. Я просто робить його більш читабельним
Відчуває себе гарним підходом до регулярного вираження.
var s = "40,595 p.a.";
var stripped = Regex.Replace(s, "[^0-9]", "");
"[^0-9]"можна замінити, @"\D"але мені подобається читабельність [^0-9].
Кращим підходом стане метод розширення:
public static string GetNumbers(this string text)
{
text = text ?? string.Empty;
return new string(text.Where(p => char.IsDigit(p)).ToArray());
}
if (text == null) return string.Empty;понад text = text ?? string.Empty;. Таким чином ми не знижуємо продуктивність.
Використовуйте або регулярний вираз, який фіксує лише 0-9, а решту викидає. Регулярний вираз - це операція, яка коштуватиме вперше багато. Або зробити щось подібне:
var sb = new StringBuilder();
var goodChars = "0123456789".ToCharArray();
var input = "40,595";
foreach(var c in input)
{
if(goodChars.IndexOf(c) >= 0)
sb.Append(c);
}
var output = sb.ToString();
Щось подібне, я думаю, я ще не склав ..
LINQ - це, як сказав Фредрік, також варіант
Ще один варіант ...
private static string RemoveNonNumberDigitsAndCharacters(string text)
{
var numericChars = "0123456789,.".ToCharArray();
return new String(text.Where(c => numericChars.Any(n => n == c)).ToArray());
}
public static string RemoveNonNumeric(string value) => Regex.Replace(value, "[^0-9]", "");
Ось код за допомогою регулярних виразів:
string str = "40,595 p.a.";
StringBuilder convert = new StringBuilder();
string pattern = @"\d+";
Regex regex = new Regex(pattern);
MatchCollection matches = regex.Matches(str);
foreach (Match match in matches)
{
convert.Append(match.Groups[0].ToString());
}
int value = Convert.ToInt32(convert.ToString());
Прийнята відповідь чудова, проте вона не враховує значення NULL, що робить її непридатною у більшості сценаріїв.
Це наштовхнуло мене на використання цих помічницьких методів. Перший відповідає на ОП, а другий може бути корисним для тих, хто хоче виконати навпаки:
/// <summary>
/// Strips out non-numeric characters in string, returning only digits
/// ref.: /programming/3977497/stripping-out-non-numeric-characters-in-string
/// </summary>
/// <param name="input">the input string</param>
/// <param name="throwExceptionIfNull">if set to TRUE it will throw an exception if the input string is null, otherwise it will return null as well.</param>
/// <returns>the input string numeric part: for example, if input is "XYZ1234A5U6" it will return "123456"</returns>
public static string GetNumbers(string input, bool throwExceptionIfNull = false)
{
return (input == null && !throwExceptionIfNull)
? input
: new string(input.Where(c => char.IsDigit(c)).ToArray());
}
/// <summary>
/// Strips out numeric and special characters in string, returning only letters
/// </summary>
/// <param name="input">the input string</param>
/// <param name="throwExceptionIfNull">if set to TRUE it will throw an exception if the input string is null, otherwise it will return null as well.</param>
/// <returns>the letters contained within the input string: for example, if input is "XYZ1234A5U6~()" it will return "XYZAU"</returns>
public static string GetLetters(string input, bool throwExceptionIfNull = false)
{
return (input == null && !throwExceptionIfNull)
? input
: new string(input.Where(c => char.IsLetter(c)).ToArray());
}
/// <summary>
/// Strips out any non-numeric/non-digit character in string, returning only letters and numbers
/// </summary>
/// <param name="input">the input string</param>
/// <param name="throwExceptionIfNull">if set to TRUE it will throw an exception if the input string is null, otherwise it will return null as well.</param>
/// <returns>the letters contained within the input string: for example, if input is "XYZ1234A5U6~()" it will return "XYZ1234A5U6"</returns>
public static string GetLettersAndNumbers(string input, bool throwExceptionIfNull = false)
{
return (input == null && !throwExceptionIfNull)
? input
: new string(input.Where(c => char.IsLetterOrDigit(c)).ToArray());
}
Для отримання додаткової інформації читайте це повідомлення в моєму блозі.
var output = new string(input.Where(char.IsNumber).ToArray());