Есть ли эквивалент JavaScript parseInt в С#?

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

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

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

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

Ответ 1

Вы близко.

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

foreach (Match match in Regex.Matches(input, @"^\d+"))
{
  return int.Parse(match.Value);
}

Ответ 2

Вот полный пример. Он выдаст исключение, если вы не дадите ему допустимую строку - вы можете изменить это поведение, не явно бросая исключение в 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);
    }
}

Ответ 3

Небольшое изменение в превосходном решении Jon Skeet в порядке.

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

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

Это разрешает случай ведущих символов перед первым вхождением цифры
(например, asb1235412354) и оба знаковых целочисленных случая (например, + или -)

Ответ 4

    public static int ParseInteger( object oItem )
    {
            int iItem = 0;
            if (oItem != null) {
                    Int32.TryParse( Regex.Match( oItem.ToString(), @"\d+" ).Value, out iItem );
            }
            return iItem;
    }

Ответ 5

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

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

Ответ 6

int nr = Int32.Parse(yourstring);

Ответ 7

Вам НЕ нужно писать свою собственную функцию синтаксического анализа!!!!

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

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

Или: // использовать их зависят от вашей ситуации:

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

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