Как мне преобразовать число с текстовым суффиксом в целое число в c #? - PullRequest
2 голосов
/ 07 мая 2009

Какой самый чистый / лучший способ в C # преобразовать что-то вроде 400AMP или 6M в целое число? Я не всегда буду знать, что такое суффикс, и я просто хочу уйти и оставить меня с номером.

Ответы [ 5 ]

13 голосов
/ 07 мая 2009

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

Regex reg = new Regex("[0-9]*");
int result = Convert.ToInt32(reg.Match(input));
6 голосов
/ 07 мая 2009

Хорошо, вот длинное решение, которое должно быть достаточно быстрым. Это похоже на средний ответ Гуффы, но я поместил условия внутри тела цикла, так как считаю, что это проще (и позволяет нам выбрать персонажа только один раз). Это действительно вопрос личного вкуса.

Намеренно не ограничивает ограничение количества совпадающих цифр, потому что, если строка является целым числом, которое выходит за Int32, я думаю, что я предпочел бы увидеть исключение, а не просто большое целое число :)

Обратите внимание, что это также обрабатывает отрицательные числа, что я не думаю, что другие решения до сих пор делают ...

using System;

class Test
{
    static void Main()
    {
        Console.WriteLine(ParseLeadingInt32("-1234AMP"));
        Console.WriteLine(ParseLeadingInt32("+1234AMP"));
        Console.WriteLine(ParseLeadingInt32("1234AMP"));
        Console.WriteLine(ParseLeadingInt32("-1234"));
        Console.WriteLine(ParseLeadingInt32("+1234"));
        Console.WriteLine(ParseLeadingInt32("1234"));
   }

    static int ParseLeadingInt32(string text)
    {
        // Declared before loop because we need the
        // final value
        int i;
        for (i=0; i < text.Length; i++)
        {
            char c = text[i];
            if (i==0 && (c=='-' || c=='+'))
            {
                continue;
            }
            if (char.IsDigit(c))
            {
                continue;
            }
            break;
        }
        return int.Parse(text.Substring(0, i));
    }
}
6 голосов
/ 07 мая 2009

Возможно, это не самый чистый метод, но он достаточно простой (с одним вкладышем), и я мог бы представить его быстрее, чем регулярное выражение (без компиляции, конечно).

var str = "400AMP";
var num = Convert.ToInt32(str.Substring(0, str.ToCharArray().TakeWhile(
    c => char.IsDigit(c)).Count()));

Или как метод расширения:

public static int GetInteger(this string value)
{
    return Convert.ToInt32(str.Substring(0, str.ToCharArray().TakeWhile(
        c => char.IsDigit(c)).Count()));
}

Эквивалентно, вы можете построить числовую строку из результата функции TakeWhile, например:

public static int GetInteger(this string value)
{
    return new string(str.ToCharArray().TakeWhile(
        c => char.IsNumber(c)).ToArray());
}

Я не тестировал их, поэтому я не знаю, что из них быстрее (хотя я бы очень заподозрил первое). Если вы хотите получить более высокую производительность, вы просто конвертируете LINQ (вызов метода расширения для перечислимых) в цикл for.

Надеюсь, это поможет.

1 голос
/ 07 мая 2009

Есть несколько вариантов ...

Как и при использовании регулярного выражения:

int result = int.Parse(Regex.Match(input, @"^\d+").Groups[0].Value);

Среди самых быстрых; просто цикл, чтобы найти цифры:

int i = 0;
while (i < input.Length && Char.IsDigit(input, i)) i++;
int result = int.Parse(input.Substring(0, i));

Используйте LastIndexOfAny, чтобы найти последнюю цифру:

int i = input.LastIndexOfAny("0123456789".ToCharArray()) + 1;
int result = int.Parse(input.Substring(0, i));

(Примечание: разрывы на строки, содержащие цифры после суффикса, например «123asdf123».)

Вероятно, самый быстрый; разбери сам:

int i = 0;
int result = 0;
while (i < input.Length) {
    char c = input[i];
    if (!Char.IsDigit(c)) break;
    result *= 10;
    result += c - '0';
    i++;
}
0 голосов
/ 07 мая 2009

Если все, что вы хотите сделать, это удалить неизвестный постфикс из того, что иначе было бы int, вот как я бы это сделал:

Мне нравится статический метод утилиты, который я вызываю IsInt (stringableInt), который, как следует из названия, вернет True, если строка будет проанализирована в int. Вы можете написать тот же статический метод в своем служебном классе (если его там еще нет) и попробовать:

       `string foo = "12345SomePostFix";
        while (!Tools.ToolBox.IsInt(foo))
        {
            foo = foo.Remove(foo.Length - 1);
        }
        int fooInt = int.Parse(foo);`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...