在C#中是否有与JavaScript parseInt等价的语言?

在C#中是否有与JavaScript parseInt等价的语言?,c#,javascript,integer,parseint,C#,Javascript,Integer,Parseint,我想知道是否有人组装了一些东西,或者看到了一些与C#的JavaScript parseInt等价的东西 具体来说,我希望使用如下字符串: 123abc4567890 并仅返回第一个有效整数 123 我使用了一个静态方法,只返回数字: public static int ParseInteger( object oItem ) { string sItem = oItem.ToString(); sItem = Regex.Replace( sItem

我想知道是否有人组装了一些东西,或者看到了一些与C#的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);
    }
}
可以使用此正则表达式(“\A\d+”)在字符串开头查找数字


然后,您可以使用int.Parse()将该字符串转换为实际整数。

对Jon Skeet的优秀解决方案稍加修改即可

    public static int ParseInteger( object oItem )
    {
            int iItem = 0;
            if (oItem != null) {
                    Int32.TryParse( Regex.Match( oItem.ToString(), @"\d+" ).Value, out iItem );
            }
            return iItem;
    }
我会将正则表达式更改为(如Jon所述):

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

这允许在第一次出现数字之前出现前导字符的情况

(例如,
asb12354
->
12354
)和两种带符号整数情况(例如,
+
-

您不必编写自己的int解析函数

我知道这根线很旧了。但有一些简单的方法可以做到这一点:

int.Parse(urString);
use short.Parse(urString); //if you want a short
或: //根据您的情况使用以下选项:

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

我在回答您的主题问题“C#中是否有与JavaScript parseInt等价的语言?”时,只是给您一些想法,而不是为您编写代码。您需要首先对“字母字符”进行筛选,您可以使用正则表达式或简单字符串进行筛选。替换,或由您决定

那会把ab12cd转换成12,不是吗?这很可能是人们想要的行为——我不确定。我之所以这么问,是因为我的版本只有在数字位于字符串开头时才有效。啊,你是对的,重新开始时的a^可能足够好了:)谢谢,我不是说这是必需的,因为你的实现行为可能是可取的,我想检查:)不能在该foreach中使用var,因为Regex.Matches返回的MatchCollection是非泛型ICollection。碰巧我昨天在博客上写了这个:谢谢你的回答,他们都很有帮助。我将leppie's标记为已被接受,因为它是第一个,而且确实有效。我拿了他的,带着它跑了起来,做了一些修改。乔恩·斯基特的绝对是最完整的。再次感谢!你能告诉我,你的、被接受的和我的在运行时/性能上有什么不同吗?内部正则表达式是否完全按照我发布的方式工作?您必须对其进行基准测试以了解性能。我不知道.NET正则表达式是如何实现的。不过,这取决于选项——在这种情况下,我没有指定它应该被编译,这可能会在编译的初始命中后提高性能。当您编写基准测试套件时:您是否可以在空闲时间为我运行此测试?恐怕基准测试套件仍在开发中。随着第二版《C#in Depth》的修订,我现在真的没有时间做这件事。抱歉:(啊……没关系……等我有时间的时候,我会自己看一看的!鉴于示例字符串“123abc4567890”,所有这些都会失败,因此需要一些自定义的东西。我在回答你的主题问题“C#中是否有与JavaScript parseInt等价的东西?”,只是给您一些想法,而不是为您编写代码。您需要首先对“字母字符”进行筛选,您可以使用正则表达式或简单字符串进行筛选。替换,或由您决定。
int nr = Int32.Parse(yourstring);