Вырезание нечисловых символов в строке

Привет, я хочу вырезать нечисловые символы в строке в ASP.NET С#

Итак, 40 595 p.a.

закончится с 40595

Спасибо

Ответ 1

Существует много способов, но это должно (не знаю, как это работает с действительно большими строками):

private static string GetNumbers(string input)
{
    return new string(input.Where(c => char.IsDigit(c)).ToArray());
}

Ответ 2

Похоже на хорошее соответствие регулярному выражению.

var s = "40,595 p.a.";
var stripped = Regex.Replace(s, "[^0-9]", "");

"[^0-9]" можно заменить на @"\D", но мне нравится читаемость [^0-9].

Ответ 3

Используйте регулярное выражение, которое захватывает только 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, как сказал Фредрик, также вариант

Ответ 4

Метод расширения будет лучше:

public static string GetNumbers(this string text)
    {
        text = text ?? string.Empty;
        return new string(text.Where(p => char.IsDigit(p)).ToArray());
    }

Ответ 5

Другая опция...

private static string RemoveNonNumberDigitsAndCharacters(string text)
{
    var numericChars = "0123456789,.".ToCharArray();
    return new String(text.Where(c => numericChars.Any(n => n == c)).ToArray());
}

Ответ 6

Ну, вы знаете, что такое цифры: 0123456789, правильно? Перемещайте строку по символу; если символ - это цифра, наклейте его на конец строки temp, иначе игнорируйте. Для строк С# могут быть другие вспомогательные методы, но это универсальный подход, который работает повсеместно.

Ответ 7

Вот код с использованием регулярных выражений:

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()); 

Ответ 8

Здесь другая реализация; Мне также нужно было сохранить несколько других персонажей, но просто удалить их из этого списка отвечает на исходный вопрос. Это в два раза быстрее, чем реализация linq, когда вызывается многократно, и имеет меньшее время запуска, когда вызывается в первый раз.

StringBuilder sb = new StringBuilder();
char[] textArray = _text.ToCharArray();
foreach (char c in textArray) {
    switch (c)
    {
        case '0' :
        case '1' :
        case '2' :
        case '3' :
        case '4' :
        case '5' :
        case '6' :
        case '7' :
        case '8' :
        case '9' :
        case '.' :
        case '+' :
        case '-' :
            sb.Append(c);
            break;
    }
}

Ответ 9

Принятый ответ велик, однако он не учитывает значения NULL, что делает его непригодным для большинства сценариев.

Это заставило меня использовать эти вспомогательные методы. Первый отвечает OP, в то время как другие могут быть полезны для тех, кто хочет выполнить обратное:

    /// <summary>
    /// Strips out non-numeric characters in string, returning only digits
    /// ref.: https://stackoverflow.com/info/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());
    }

Для дополнительной информации прочитайте этот пост.