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. doublelongint

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, , decimalvb.) 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 ParseTryParsegö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