Ответ 1
Вы близко.
Вероятно, вы просто хотите:
foreach (Match match in Regex.Matches(input, @"^\d+"))
{
return int.Parse(match.Value);
}
Мне было интересно, собрал ли кто-нибудь что-нибудь или увидел что-то, что эквивалентно 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
Я не уверен, возможно ли это делать с регулярным выражением, или если есть лучший способ захватить только первое целое из строки.
Вы близко.
Вероятно, вы просто хотите:
foreach (Match match in Regex.Matches(input, @"^\d+"))
{
return int.Parse(match.Value);
}
Вот полный пример. Он выдаст исключение, если вы не дадите ему допустимую строку - вы можете изменить это поведение, не явно бросая исключение в 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);
}
}
Небольшое изменение в превосходном решении Jon Skeet в порядке.
Я бы изменил регулярное выражение на (как упоминал Джон):
@"^([^\d]+)?(+|-)?\d+"
Это разрешает случай ведущих символов перед первым вхождением цифры
(например, asb12354
→ 12354
) и оба знаковых целочисленных случая (например, +
или -
)
public static int ParseInteger( object oItem )
{
int iItem = 0;
if (oItem != null) {
Int32.TryParse( Regex.Match( oItem.ToString(), @"\d+" ).Value, out iItem );
}
return iItem;
}
Вы можете использовать этот RegEx ( "\ A\d +" ) для поиска чисел в начале строки.
Затем вы можете использовать int.Parse() для преобразования этой строки в фактическое целое число.
int nr = Int32.Parse(yourstring);
Вам НЕ нужно писать свою собственную функцию синтаксического анализа!!!!
Я знаю, что эта тема довольно старая. но есть простой способ сделать это:
int.Parse(urString);
use short.Parse(urString); //if you want a short
Или: // использовать их зависят от вашей ситуации:
Convert.ToInt16();
Convert.ToInt32();
Convert.ToInt64();
Примечание:
Я отвечаю на ваш вопрос темы "Есть ли эквивалент JavaScript parseInt в С#?", Просто дайте вам некоторую идею, НЕ записывайте свой код для вас. Вам нужно сначала выполнить фильтрацию "Алфавитные символы", вы можете сделать это с помощью регулярного выражения или простой строки. Замените или до вас.