Frage

Ich habe mich gefragt, ob jemand gestellt hatte etwas zusammen oder hatte etwas Gleichwertiges an den JavaScript-ParseInt für C # gesehen.

Insbesondere suche ich nach einer Zeichenfolge nehmen wie:

123abc4567890

und nur die erste gültige ganze Zahl zurückgeben

123

Ich habe eine statische Methode, die ich verwendet habe, dass nur die Zahlen zurück:

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;
    }

Das oben würde:

ParseInteger( "123abc4567890" );

und geben Sie mir zurück

1234567890

Ich bin mir nicht sicher, ob es möglich ist, mit einem regulären Ausdruck zu tun, oder wenn es eine bessere Methode nur die erste ganze Zahl aus dem String zu greifen.

War es hilfreich?

Lösung

Sie sind in der Nähe.

Sie wahrscheinlich nur wollen:

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

Andere Tipps

Hier ist ein vollständiges Beispiel. Es wird eine Ausnahme aus, wenn Sie nicht über eine gültige Zeichenfolge geben -. Sie dieses Verhalten ändern können, indem nicht explizit eine Ausnahme in ParseInteger werfen, und mit int.TryParse statt

Beachten Sie, dass es eine führende erlaubt - Zeichen als gut, aber nicht ein führender +. (Auch hier leicht zu ändern.)

Beachten Sie auch, dass, obwohl ich drei Testfälle für den Erfolg Situationen haben, ich habe keine Testfälle für das Scheitern nicht bekam.

Schließlich wird es nicht „abc123def“ entspricht. Wenn Sie es möchten, entfernen Sie die ^ von der Regex.

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);
    }
}

Eine leichte Veränderung zu Jon Skeet ausgezeichneter Lösung ist in Ordnung.

Ich würde die Regex ändern (wie von Jon erwähnt):

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

Dies ermöglicht für den Fall von Zeichen vor dem ersten Auftreten eines einstelligen
führenden (Z.B. asb12354 -> 12354) und beide Ganzzahl mit Vorzeichen Fällen (z.B. + oder -)

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

Sie können diese RegEx verwenden ( "\ A \ d +") Zahlen einer Zeichenfolge am Anfang zu finden.

Sie können dann mit int.Parse () die Zeichenfolge in eine tatsächliche Ganzzahl umgewandelt werden.

int nr = Int32.Parse(yourstring);

Sie müssen nicht Ihre eigene int Parse-Funktion schreiben !!!!

Ich weiß, dieser Thread ist ziemlich alt. aber es gibt einige einfache Möglichkeit, dies zu tun:

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

Oder: // diejenigen, hängen von Ihrer Situation verwenden:

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

Hinweis:
Ich antworte Ihr Thema Frage „Gibt es ein Äquivalent zu JavaScript ParseInt in C #?“, Die Sie gerade eine Idee geben, schreiben Sie nicht, Ihren Code für Sie. Sie müssen zuerst einen Filter tun auf ‚alphabetischen Zeichen‘, können Sie es mit Regular Expression oder einem einfachen String.Replace tun können, oder bis zu Ihnen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top