Dizeyi sayıya dönüştürme (C# Programlama Kılavuzu)
Sayısal türlerde (, , vb.) bulunan veya TryParse
yöntemini çağırarak Parse
veya sınıfındaki yöntemleri kullanarak bir string
sayıya System.Convert dönüştürebilirsiniz. double
long
int
Bir yöntemi (örneğin, ) veya Parse
yöntemi (örneğin, int.TryParse("11", out number)
var number = int.Parse("11")
) çağırmak TryParse
biraz daha verimli ve basittir. yöntemi Convert kullanmak, uygulayan IConvertiblegenel nesneler için daha kullanışlıdır.
Dizenin içerdiğini beklediğiniz sayısal türde veya TryParse
yöntemlerini kullanırsınızParse
, örneğin System.Int32 türü. Convert.ToInt32 yöntemi dahili olarak kullanırParse. Parse
yöntemi dönüştürülen sayıyı döndürür; yöntem, dönüştürmenin TryParse
başarılı olup olmadığını gösteren bir boole değeri döndürür ve bir parametrede out
dönüştürülen sayıyı döndürür. Dize geçerli bir biçimde değilse, Parse
bir özel durum oluşturur, ancak TryParse
döndürür false
. Bir Parse
yöntemi çağırırken ayrıştırma işlemi başarısız olduğunda yakalamak FormatException için her zaman özel durum işlemeyi kullanmanız gerekir.
Ayrıştırma veya TryParse yöntemlerini çağırma
Parse
ve TryParse
yöntemleri dizenin başındaki ve sonundaki boşlukları yoksayar, ancak diğer tüm karakterler uygun sayısal türü (int
, long
, ulong
, float
, , decimal
vb.) oluşturan karakterler olmalıdır. Dizede sayıyı oluşturan herhangi bir boşluk hataya neden olur. Örneğin, "10", "10.3" veya " 10 " ayrıştırmak için kullanabilirsiniz decimal.TryParse
, ancak bu yöntemi kullanarak "10X", "1 0" (eklenmiş alanı not edin), "10 .3" (eklenmiş alanı not edin), "10e1" (float.TryParse
burada çalışır) vb. ayrıştırabilirsiniz. Değeri null
başarılı bir şekilde ayrıştırmayan veya String.Empty ayrıştırmayan bir dize. yöntemini çağırarak ayrıştırmaya çalışmadan önce null veya boş bir dize olup String.IsNullOrEmpty olmadığını kontrol edebilirsiniz.
Aşağıdaki örnekte ve için hem başarılı hem de başarısız çağrılar Parse
TryParse
gösterilmektedir.
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.
}
}
Aşağıdaki örnek, baştaki sayısal karakterleri (onaltılık karakterler dahil) ve sondaki sayısal olmayan karakterleri içermesi beklenen bir dizeyi ayrıştırmaya yönelik bir yaklaşımı gösterir. Yöntemini çağırmadan TryParse önce dizenin başından yeni bir dizeye geçerli karakterler atar. Ayrıştırılacak dizeler birkaç karakter içerdiğinden, örnek yeni bir dizeye geçerli karakterler atamak için yöntemini çağırır String.Concat . Daha büyük bir dize için StringBuilder sınıfı bunun yerine kullanılabilir.
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
}
}
Çağrı Dönüştürme yöntemleri
Aşağıdaki tabloda, sınıfındaki bir dizeyi Convert sayıya dönüştürmek için kullanabileceğiniz yöntemlerden bazıları listelenir.
Sayısal tür | Metot |
---|---|
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) |
Aşağıdaki örnek, giriş dizesini Convert.ToInt32(String) int'e dönüştürmek için yöntemini çağırır. Örnek, şu yöntem tarafından oluşturulan en yaygın iki özel durumu yakalar: FormatException ve OverflowException. Sonuçta elde edilen sayı aşılmadan Int32.MaxValueartırılabilirse, örnek sonuda 1 ekler ve çıktıyı görüntüler.
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
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin