Share via


Een tekenreeks converteren naar een getal (C#-programmeerhandleiding)

U converteert een string getal naar een getal door de Parse of TryParse methode aan te roepen die is gevonden op numerieke typen (doubleintlong, enzovoort) of door methoden in de System.Convert klasse te gebruiken.

Het is iets efficiënter en eenvoudig om een TryParse methode aan te roepen (bijvoorbeeld int.TryParse("11", out number)) of Parse methode (bijvoorbeeld var number = int.Parse("11")). Het gebruik van een Convert methode is nuttiger voor algemene objecten die worden geïmplementeerd IConvertible.

U gebruikt Parse of TryParse methoden voor het numerieke type dat u verwacht dat de tekenreeks bevat, zoals het System.Int32 type. De Convert.ToInt32 methode gebruikt Parse intern. De Parse methode retourneert het geconverteerde getal. De TryParse methode retourneert een Booleaanse waarde die aangeeft of de conversie is geslaagd en retourneert het geconverteerde getal in een out parameter. Als de tekenreeks niet in een geldige indeling staat, genereert u een uitzondering, Parse maar TryParse retourneert falseu deze. Wanneer u een Parse methode aanroept, moet u altijd uitzonderingsafhandeling gebruiken om te FormatException zien wanneer de parseringsbewerking mislukt.

Methoden Parse of TryParse aanroepen

De Parse en TryParse methoden negeren witruimte aan het begin en aan het einde van de tekenreeks, maar alle andere tekens moeten tekens zijn die het juiste numerieke type vormen (int, longulong, , floatenzovoortdecimal). Eventuele witruimte in de tekenreeks die het getal vormt, veroorzaakt een fout. U kunt decimal.TryParse bijvoorbeeld '10', '10.3' of '10' parseren, maar u kunt deze methode niet gebruiken om 10 te parseren van '10X', '1 0' (let op de ingesloten ruimte), '10 .3' (noteer de ingesloten ruimte), '10e1' (float.TryParse werkt hier) enzovoort. Een tekenreeks waarvan de waarde is null of String.Empty die niet kan worden geparseerd. U kunt controleren op een null- of lege tekenreeks voordat u deze probeert te parseren door de String.IsNullOrEmpty methode aan te roepen.

In het volgende voorbeeld ziet u zowel geslaagde als mislukte aanroepen naar Parse en TryParse.

using System;

public static class StringConversion
{
    public static void Main()
    {
        string input = String.Empty;
        try
        {
            int result = Int32.Parse(input);
            Console.WriteLine(result);
        }
        catch (FormatException)
        {
            Console.WriteLine($"Unable to parse '{input}'");
        }
        // Output: Unable to parse ''

        try
        {
            int numVal = Int32.Parse("-105");
            Console.WriteLine(numVal);
        }
        catch (FormatException e)
        {
            Console.WriteLine(e.Message);
        }
        // Output: -105

        if (Int32.TryParse("-105", out int j))
        {
            Console.WriteLine(j);
        }
        else
        {
            Console.WriteLine("String could not be parsed.");
        }
        // Output: -105

        try
        {
            int m = Int32.Parse("abc");
        }
        catch (FormatException e)
        {
            Console.WriteLine(e.Message);
        }
        // Output: Input string was not in a correct format.

        const string inputString = "abc";
        if (Int32.TryParse(inputString, out int numValue))
        {
            Console.WriteLine(numValue);
        }
        else
        {
            Console.WriteLine($"Int32.TryParse could not parse '{inputString}' to an int.");
        }
        // Output: Int32.TryParse could not parse 'abc' to an int.
    }
}

In het volgende voorbeeld ziet u een benadering voor het parseren van een tekenreeks die naar verwachting leidende numerieke tekens bevat (inclusief hexadecimale tekens) en volgtekens die niet-numerieke tekens bevatten. Er worden geldige tekens vanaf het begin van een tekenreeks aan een nieuwe tekenreeks toegewezen voordat de TryParse methode wordt aangeroepen. Omdat de tekenreeksen die moeten worden geparseerd enkele tekens bevatten, roept het voorbeeld de String.Concat methode aan om geldige tekens toe te wijzen aan een nieuwe tekenreeks. Voor een grotere tekenreeks kan de StringBuilder klasse worden gebruikt.

using System;

public static class StringConversion
{
    public static void Main()
    {
        var str = "  10FFxxx";
        string numericString = string.Empty;
        foreach (var c in str)
        {
            // Check for numeric characters (hex in this case) or leading or trailing spaces.
            if ((c >= '0' && c <= '9') || (char.ToUpperInvariant(c) >= 'A' && char.ToUpperInvariant(c) <= 'F') || c == ' ')
            {
                numericString = string.Concat(numericString, c.ToString());
            }
            else
            {
                break;
            }
        }

        if (int.TryParse(numericString, System.Globalization.NumberStyles.HexNumber, null, out int i))
        {
            Console.WriteLine($"'{str}' --> '{numericString}' --> {i}");
        }
        // Output: '  10FFxxx' --> '  10FF' --> 4351

        str = "   -10FFXXX";
        numericString = "";
        foreach (char c in str)
        {
            // Check for numeric characters (0-9), a negative sign, or leading or trailing spaces.
            if ((c >= '0' && c <= '9') || c == ' ' || c == '-')
            {
                numericString = string.Concat(numericString, c);
            }
            else
            {
                break;
            }
        }

        if (int.TryParse(numericString, out int j))
        {
            Console.WriteLine($"'{str}' --> '{numericString}' --> {j}");
        }
        // Output: '   -10FFXXX' --> '   -10' --> -10
    }
}

Methoden voor converteren aanroepen

De volgende tabel bevat een aantal methoden uit de Convert klasse die u kunt gebruiken om een tekenreeks te converteren naar een getal.

Numeriek type Wijze
decimal ToDecimal(String)
float ToSingle(String)
double ToDouble(String)
short ToInt16(String)
int ToInt32(String)
long ToInt64(String)
ushort ToUInt16(String)
uint ToUInt32(String)
ulong ToUInt64(String)

In het volgende voorbeeld wordt de Convert.ToInt32(String) methode aangeroepen om een invoertekenreeks te converteren naar een int. In het voorbeeld worden de twee meest voorkomende uitzonderingen van deze methode onderschept: FormatException en OverflowException. Als het resulterende getal kan worden verhoogd zonder te overschrijden Int32.MaxValue, voegt het voorbeeld 1 toe aan het resultaat en wordt de uitvoer weergegeven.

using System;

public class ConvertStringExample1
{
    static void Main(string[] args)
    {
        int numVal = -1;
        bool repeat = true;

        while (repeat)
        {
            Console.Write("Enter a number between −2,147,483,648 and +2,147,483,647 (inclusive): ");

            string? input = Console.ReadLine();

            // ToInt32 can throw FormatException or OverflowException.
            try
            {
                numVal = Convert.ToInt32(input);
                if (numVal < Int32.MaxValue)
                {
                    Console.WriteLine("The new value is {0}", ++numVal);
                }
                else
                {
                    Console.WriteLine("numVal cannot be incremented beyond its current value");
                }
           }
            catch (FormatException)
            {
                Console.WriteLine("Input string is not a sequence of digits.");
            }
            catch (OverflowException)
            {
                Console.WriteLine("The number cannot fit in an Int32.");
            }

            Console.Write("Go again? Y/N: ");
            string? go = Console.ReadLine();
            if (go?.ToUpper() != "Y")
            {
                repeat = false;
            }
        }
    }
}
// Sample Output:
//   Enter a number between -2,147,483,648 and +2,147,483,647 (inclusive): 473
//   The new value is 474
//   Go again? Y/N: y
//   Enter a number between -2,147,483,648 and +2,147,483,647 (inclusive): 2147483647
//   numVal cannot be incremented beyond its current value
//   Go again? Y/N: y
//   Enter a number between -2,147,483,648 and +2,147,483,647 (inclusive): -1000
//   The new value is -999
//   Go again? Y/N: n