【问题标题】:Is there an equivalent to JavaScript parseInt in C#?C# 中是否有等效于 JavaScript parseInt 的方法?
【发布时间】:2009-06-10 13:08:58
【问题描述】:

我想知道是否有人将某些东西放在一起或看到过与 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

我不确定是否可以使用正则表达式,或者是否有更好的方法来仅从字符串中获取第一个整数。

【问题讨论】:

  • 感谢所有的答案,他们都非常有帮助。我将 leppie's 标记为已接受,因为它是第一个并且确实有效。我拿走了他的东西,并进行了一些修改。 Jon Skeet 的绝对是最完整的。再次感谢!

标签: c# javascript integer parseint


【解决方案1】:

你很接近。

你可能只是想要:

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

【讨论】:

  • 这会将“ab12cd”转换为 12,不是吗?这很可能是理想的行为——我不确定。我只是问,因为我的版本仅在数字位于字符串开头时才有效。
  • 啊,你是对的,RE 开头的 ^ 可能就足够了 :) 谢谢
  • leppie:我并不是说这是必需的,而是您的实现行为可能是可取的,我想检查一下 :)
  • 您不能在该 foreach 中使用 var,因为 Regex.Matches 返回一个非通用 ICollection 的 MatchCollection。碰巧我昨天写了一篇博客:alicebobandmallory.com/articles/2009/06/09/…
【解决方案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);
    }
}

【讨论】:

  • 您能告诉我,您接受的和我的在运行时/性能方面是否有任何差异?内部正则表达式的工作方式与我发布的完全一样吗?
  • 您必须对其进行基准测试以了解性能。我不知道如何实现 .NET 正则表达式的细节。但这将取决于选项 - 在这种情况下,我没有指定它应该被编译,这可能会在最初的编译命中后提高性能。
  • 当你写了一个基准测试套件时:你能帮我在空闲时间运行这个测试吗?
  • 恐怕该基准套件仍在开发中。随着第二版 C# in Depth 的修订,我目前真的没有任何空闲时间。对不起:(
  • 啊……没关系……有时间我自己看看吧!
【解决方案3】:

对 Jon Skeet 的出色解决方案稍作改动。

我会将正则表达式更改为(如 Jon 所述):

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

这允许在第一次出现数字之前使用前导字符的大小写
(例如,asb12354 -> 12354)和两种有符号整数情况(例如,+-

【讨论】:

    【解决方案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 解析函数!!!!

          我知道这个帖子很老了。但是有一些简单的方法可以做到这一点:

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

          或者: //使用这些取决于你的情况:

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

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

          【讨论】:

          • 鉴于示例字符串“123abc4567890”,所有这些都将失败,因此需要自定义。
          • 我正在回答您的主题问题“C# 中是否有与 JavaScript parseInt 等效的内容?”,只是给您一些想法,而不是为您编写代码。您需要首先对“字母字符”进行过滤,您可以使用正则表达式或简单的字符串进行过滤。替换,或由您决定。
          猜你喜欢
          • 1970-01-01
          • 2015-09-08
          • 1970-01-01
          • 2014-04-06
          • 2019-09-12
          • 2011-03-20
          • 1970-01-01
          • 1970-01-01
          • 2012-09-20
          相关资源
          最近更新 更多