Как получить номер из строки - PullRequest
1 голос
/ 08 февраля 2010

Я хотел бы получить номер из строки, например: My123number дает 123 Аналогично, varchar (32) дает 32 и т. Д.

.

Заранее спасибо.

Ответы [ 5 ]

8 голосов
/ 08 февраля 2010

Если в строке будет закопано только одно число, и оно будет целым числом, тогда что-то вроде этого:

 int n;
 string s = "My123Number";
 if (int.TryParse (new string (s.Where (a => Char.IsDigit (a)).ToArray ()), out n)) {
    Console.WriteLine ("The number is {0}", n);
 }

Для объяснения: s.Where (a => Char.IsDigit (a)).ToArray () извлекает только цифры из исходной строки в массив char. Затем new string преобразует это в строку и, наконец, int.TryParse преобразует это в целое число.

4 голосов
/ 08 февраля 2010

вы могли бы пойти по пути регулярного выражения. который обычно быстрее, чем цикл по строке

        public int GetNumber(string text)
        {
            var exp = new Regex("(\d+)"); // find a sequence of digits could be \d+
            var matches = exp.Matches(text);

            if (matches.Count == 1) // if there's one number return that
            {
                int number =  int.Parse(matches[0].Value);
                return number
            }
            else if (matches.Count > 1)
                throw new InvalidOperationException("only one number allowed");
            else
                return 0;
        }
2 голосов
/ 08 февраля 2010

Переберите каждый символ в строке и проверьте его на число. удалите все не числа и тогда у вас будет простое целое число в виде строки. Тогда вы можете просто использовать int.parse.

string numString;
foreach(char c in inputString)
    if (Char.IsDigit(c)) numString += c;
int realNum = int.Parse(numString);
1 голос
/ 08 февраля 2010

Сначала напишите спецификацию того, что вы подразумеваете под "числом" (целое число "длинный" десятичный "двойной") и "получить число из строки". Включая все случаи, которые вы хотите обрабатывать (начальные / конечные знаки? Культурально-инвариантные разделители тысяч / десятичных дробей, чувствительные к культуре разделители тысяч / десятичных дробей, очень большие значения, строки, которые не содержат действительного числа, ... ).

Затем напишите несколько юнит-тестов для каждого случая, с которым вам нужно иметь дело.

Затем закодируйте метод (должно быть легко - в основном извлеките числовой бит из строки и попробуйте проанализировать его. Некоторые из предоставленных ответов будут работать для целых чисел, если строка не содержит значения больше Int32 .MaxValue).

1 голос
/ 08 февраля 2010

Вы можете сделать что-то вроде этого, тогда оно будет работать с более чем одним числом

public IEnumerable<string> GetNumbers(string indata)
{
    MatchCollection matches = Regex.Matches(indata, @"\d+");
    foreach (Match match in matches)
    {
        yield return match.Value;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...