如何将字符串转换为数字(C# 编程指南)

你可以调用数值类型(intlongdouble 等)中找到的 ParseTryParse 方法或使用 System.Convert 类中的方法将 string 转换为数字。

调用 TryParse 方法(例如,int.TryParse("11", out number))或 Parse 方法(例如,var number = int.Parse("11"))会稍微高效和简单一些。 使用 Convert 方法对于实现 IConvertible 的常规对象更有用。

对预期字符串会包含的数值类型(如 System.Int32 类型)使用 ParseTryParse 方法。 Convert.ToInt32 方法在内部使用 ParseParse 方法返回转换后的数字;TryParse 方法返回布尔值,该值指示转换是否成功,并以 out 参数形式返回转换后的数字。 如果字符串的格式无效,则 Parse 会引发异常,但 TryParse 会返回 false。 调用 Parse 方法时,应始终使用异常处理来捕获分析操作失败时的 FormatException

调用 Parse 或 TryParse 方法

ParseTryParse 方法会忽略字符串开头和末尾的空格,但所有其他字符都必须是组成合适数值类型(intlongulongfloatdecimal 等)的字符。 如果组成数字的字符串中有任何空格,都会导致错误。 例如,可以使用 decimal.TryParse 分析“10”、“10.3”或“ 10 ”,但不能使用此方法分析从“10X”、“1 0”(注意嵌入的空格)、“10 .3”(注意嵌入的空格)、“10e1”(float.TryParse 在此处适用)等中分析出 10。 无法成功分析值为 nullString.Empty 的字符串。 在尝试通过调用 String.IsNullOrEmpty 方法分析字符串之前,可以检查字符串是否为 Null 或为空。

下面的示例演示了对 ParseTryParse 的成功调用和不成功的调用。

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

下面的示例演示了一种分析字符串的方法,该字符串应包含前导数字字符(包括十六进制字符)和尾随的非数字字符。 在调用 TryParse 方法之前,它从字符串的开头向新字符串分配有效字符。 因为要分析的字符串包含少量字符,所以本示例调用 String.Concat 方法将有效字符分配给新字符串。 对于较大的字符串,可以改用 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
    }
}

调用 Convert 方法

下表列出了 Convert 类中可用于将字符串转换为数字的一些方法。

数值类型 方法
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)

下面的示例调用 Convert.ToInt32(String) 方法将输入字符串转换为 int。该示例将捕获由此方法引发的两个最常见异常:FormatExceptionOverflowException。 如果生成的数字可以在不超过 Int32.MaxValue 的情况下递增,则示例将向结果添加 1 并显示输出。

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

使用 GitHub Copilot 将字符串转换为数字

可以在 IDE 中使用 GitHub Copilot 生成代码,以将字符串转换为 C# 中的数字。

如果使用 Visual Studio 2022 版本 17.8 或更高版本,则可以尝试在 Visual Studio 中使用 AI 驱动的 GitHub Copilot 生成代码,以将字符串转换为数字。 在 Copilot Chat 窗口中以提示形式提交问题,如下例所示。 还可以在编辑器窗口中使用内联聊天提交提示。

注意

GitHub Copilot 由 AI 提供支持,因此可能会带来意外和错误。 请确保验证任何生成的代码或建议。 有关 GitHub Copilot 的常规用途、产品影响、人工监督和隐私的更多信息,请参阅 GitHub Copilot 常见问题解答

以下文本显示了 Copilot 聊天的示例提示:

生成 C# 代码,以使用 TryParse 将字符串“123”转换为数字。 提供示例输出。

可以根据要求自定义提示以使用字符串。

可以使用聊天功能(如斜杠命令、引用文件、方法或类和线程)来设置意向,并通过已限定范围上下文获取更好的答案。 对于在 IDE 中打开的现有文件,可以使用内联聊天 /generate code to convert the string string1 in #Filename to a number提示 GitHub Copilot。

以下输出显示了 Copilot 聊天响应示例:

Here is a C# code snippet to convert the string "123" to a number using TryParse:

using System;

class Program
{
    static void Main()
    {
        string numberString = "123";
        int number;
        bool success = int.TryParse(numberString, out number);
        
        if (success)
        {
            // Example output
            Console.WriteLine("The converted number is: " + number);
        }
        else
        {
            Console.WriteLine("Conversion failed.");
        }
    }
}

When you run this code, the output will be:
The converted number is: 123

当 Copilot 返回代码块时,响应包括用于复制代码、将代码插入新文件或预览代码输出的选项。

注意

结果可能与示例响应中显示的结果不同。 AI 模型不确定,这意味着当被问及相同的问题时,它们可以返回不同的响应。 这可能是由于一段时间内进行的额外学习和调整、语言变体、上下文中的更改(如聊天历史记录等)。

显示使用 Visual Studio 中的 GitHub Copilot Chat 将字符串转换为数字的屏幕截图。

有关详细信息,请参阅: