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 (double
int
long
, 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 false
u 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
, long
ulong
, , float
enzovoortdecimal
). 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