Есть ли в C # эквивалент JavaScript parseInt? - PullRequest
10 голосов
/ 10 июня 2009

Мне было интересно, собрал ли кто-нибудь что-нибудь или видел что-то эквивалентное синтаксическому анализу JavaScript для C #.

В частности, я хочу взять строку вроде:

123abc4567890

и вернуть только первое действительное целое число

123

У меня есть статический метод, который я использовал, который будет возвращать только числа:

public static int ParseInteger( object oItem )
    {
        string sItem = oItem.ToString();

        sItem = Regex.Replace( sItem, @"([^\d])*", "" );

        int iItem = 0;

        Int32.TryParse( sItem, out iItem );

        return iItem;
    }

Вышеуказанное займет:

ParseInteger( "123abc4567890" );

и верни мне

1234567890

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

Ответы [ 7 ]

17 голосов
/ 10 июня 2009

Вы рядом.

Вы, вероятно, просто хотите:

foreach (Match match in Regex.Matches(input, @"^\d+"))
{
  return int.Parse(match.Value);
}
9 голосов
/ 10 июня 2009

Вот полный пример. Он выдаст исключение, если вы не дадите ему допустимую строку - вы можете изменить это поведение, не выбрасывая явное исключение в ParseInteger и используя вместо него int.TryParse.

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

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

Наконец, он не будет совпадать с "abc123def". Если вы хотите, удалите ^ из регулярного выражения.

using System;
using System.Text;
using System.Text.RegularExpressions;

class Test
{
    static void Main(string[] args)
    {
        Check("1234abc", 1234);
        Check("-12", -12);
        Check("123abc456", 123);
    }

    static void Check(string text, int expected)
    {
        int actual = ParseInteger(text);
        if (actual != expected)
        {
            Console.WriteLine("Expected {0}; got {1}", expected, actual);
        }
    }

    private static readonly Regex LeadingInteger = new Regex(@"^(-?\d+)");

    static int ParseInteger(string item)
    {
        Match match = LeadingInteger.Match(item);
        if (!match.Success)
        {
            throw new ArgumentException("Not an integer");
        }
        return int.Parse(match.Value);
    }
}
2 голосов
/ 10 июня 2009

Небольшое изменение в превосходное решение Джона Скита в порядке.

Я бы изменил регулярное выражение на (как упомянуто Джоном):

@"^([^\d]+)?(+|-)?\d+"

Это учитывает регистр символов, начинающихся с первого вхождения цифры
(например, asb12354 -> 12354) и оба целых числа со знаком (например, + или -)

1 голос
/ 10 июня 2009
    public static int ParseInteger( object oItem )
    {
            int iItem = 0;
            if (oItem != null) {
                    Int32.TryParse( Regex.Match( oItem.ToString(), @"\d+" ).Value, out iItem );
            }
            return iItem;
    }
0 голосов
/ 15 марта 2013
int nr = Int32.Parse(yourstring);
0 голосов
/ 29 мая 2012

Вам не нужно писать собственную функцию int parse !!!!

Я знаю, что эта тема довольно старая. но есть несколько простых способов сделать это:

int.Parse(urString);
use short.Parse(urString); //if you want a short

Или: // использовать те, которые зависят от вашей ситуации:

Convert.ToInt16();
Convert.ToInt32();
Convert.ToInt64();

Примечание:
Я отвечаю на ваш вопрос «Есть ли в C # эквивалент JavaScript parseInt?», Просто дайте вам некоторое представление, а НЕ пишите свой код для вас. Сначала вам нужно выполнить фильтрацию по «алфавитным символам», вы можете сделать это с помощью регулярного выражения или простой строки. Заменить или до вас.

0 голосов
/ 10 июня 2009

Вы можете использовать этот RegEx ("\ A \ d +"), чтобы найти числа в начале строки.

Затем вы можете использовать int.Parse () для преобразования этой строки в фактическое целое число.

...