Sdílet prostřednictvím


Jak převést řetězec na číslo (Průvodce programováním v C#)

Převedete číslo string voláním Parse nebo TryParse metodou nalezenou u číselných typů (int, long, doubleatd.) nebo pomocí metod ve System.Convert třídě.

Je mírně efektivnější a jednodušší volat metodu TryParse (například int.TryParse("11", out number)) nebo metodu Parse (například var number = int.Parse("11")). Použití metody Convert je užitečnější pro obecné objekty, které implementují IConvertible.

U číselného typu, který očekáváte, že řetězec obsahuje, použijete metody Parse nebo TryParse, například u typu System.Int32. Metoda Convert.ToInt32 používá Parse interně. Metoda Parse vrátí převedené číslo; TryParse metoda vrátí logickou hodnotu, která určuje, zda byl převod úspěšný, a vrátí převedené číslo v parametru out . Pokud řetězec není v platném formátu, Parse vyvolá výjimku, ale TryParse vrátí false. hodnotu. Při volání metody Parse byste měli vždy použít zpracování výjimek FormatException, abyste zachytili výjimku při selhání operace analýzy.

Návod

Pomoc s AI můžete použít k převodu řetězce na číslo.

Volání metod Parse nebo TryParse

Parse Metody TryParse ignorují prázdné znaky na začátku a na konci řetězce, ale všechny ostatní znaky musí být znaky, které tvoří příslušný číselný typ (int, , long, ulongfloat, decimalatd.). Jakékoli prázdné znaky v řetězci, který tvoří číslo, způsobí chybu. Můžete například použít k parsování "10", "10,3" nebo " 10 ", ale tuto metodu nemůžete použít decimal.TryParse k parsování 10 z "10X", "1 0" (všimněte si vloženého prostoru), "10 ,3" (poznámka: vložené místo), "10e1" (float.TryParse pracuje zde) atd. Řetězec, jehož hodnota je null nebo String.Empty se nepodaří úspěšně analyzovat. Hodnotu null nebo prázdný řetězec můžete zkontrolovat voláním metody String.IsNullOrEmpty před pokusem o jeho parsování.

Následující příklad ukazuje úspěšná i neúspěšná volání k Parse a 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.
    }
}

Následující příklad ukazuje jeden přístup k analýze řetězce, u které se očekává, že bude obsahovat počáteční číselné znaky (včetně šestnáctkových znaků) a koncové nečíselné znaky. Přiřadí platné znaky od začátku řetězce k novému řetězci před voláním metody TryParse. Vzhledem k tomu, že řetězce, které mají být analyzovány, obsahují několik znaků, příklad volá metodu String.Concat pro přiřazení platných znaků k novému řetězci. Místo toho lze pro větší řetězec použít třídu StringBuilder.

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

Volání metod Convert

Následující tabulka uvádí některé metody z Convert třídy, které můžete použít k převodu řetězce na číslo.

Číselný typ metoda
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)

Následující příklad volá metodu Convert.ToInt32(String) pro převod vstupního řetězce na int. Příklad zachytí dvě nejběžnější výjimky vyvolané touto metodou: FormatException a OverflowException. Pokud je možné výsledné číslo zvýšit bez překročení Int32.MaxValue, přidá příklad k výsledku hodnotu 1 a zobrazí výstup.

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 {++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

Převod řetězce na číslo pomocí AI

Pomocí nástrojů AI, jako je GitHub Copilot, můžete vygenerovat kód jazyka C#, který převede řetězec na číslo. Výzvu můžete přizpůsobit tak, aby používala řetězec podle vašich požadavků.

Následující text ukazuje příklad výzvy pro Copilot Chat:

Show me how to parse a string as a number, but don't throw an exception if the input string doesn't represent a number.

GitHub Copilot využívá technologii AI, takže jsou možná překvapení a chyby. Další informace najdete v nejčastějších dotazech ke copilotu.

Viz také