문자열을 숫자로 변환하는 방법(C# 프로그래밍 가이드)How to convert a string to a number (C# Programming Guide)

다양한 숫자 형식(int, long, double 등)에 있는 Parse 또는 TryParse 메서드를 호출하거나 System.Convert 클래스의 메서드를 사용하여 문자열을 숫자로 변환할 수 있습니다.You can convert a string to a number by calling the Parse or TryParse method found on the various numeric types (int, long, double, etc.), or by using methods in the System.Convert class.

문자열이 있는 경우 TryParse 메서드(예: int.TryParse("11", out number)) 또는 Parse 메서드(var number = int.Parse("11"))를 호출하면 약간 더 효율적이고 간단합니다.If you have a string, it is slightly more efficient and straightforward to call a TryParse method (for example, int.TryParse("11", out number)) or Parse method (for example, var number = int.Parse("11")). Convert 메서드 사용은 IConvertible을 구현하는 일반 개체에 더 유용합니다.Using a Convert method is more useful for general objects that implement IConvertible.

Parse 또는 TryParse 메서드는 System.Int32 형식과 같이 문자열에 포함되는 숫자 형식에서 사용할 수 있습니다.You can use Parse or TryParse methods on the numeric type you expect the string contains, such as the System.Int32 type. Convert.ToInt32 메서드는 Parse를 내부적으로 사용합니다.The Convert.ToInt32 method uses Parse internally. Parse 메서드는 변환된 숫자를 반환합니다. TryParse 메서드는 변환에 성공했는지 여부를 나타내는 Boolean 값을 반환하고 변환된 숫자를 out 매개 변수로 반환합니다.The Parse method returns the converted number; the TryParse method returns a Boolean value that indicates whether the conversion succeeded, and returns the converted number in an out parameter. 문자열이 유효한 형식이 아닌 경우 Parse는 예외를 throw하는 반면, TryParse에서 false를 반환합니다.If the string is not in a valid format, Parse throws an exception, whereas TryParse returns false. Parse 메서드를 호출할 때는 항상 예외 처리를 사용하여 구문 분석 작업이 실패하는 이벤트에서 FormatException을 catch해야 합니다.When calling a Parse method, you should always use exception handling to catch a FormatException in the event that the parse operation fails.

Parse 및 TryParse 메서드 호출Calling the Parse and TryParse methods

ParseTryParse 메서드는 문자열의 시작과 끝에 있는 공백을 무시하지만 다른 모든 문자는 적절한 숫자 형식(int, long, ulong, float, decimal 등)을 구성하는 문자여야 합니다.The Parse and TryParse methods ignore white space at the beginning and at the end of the string, but all other characters must be characters that form the appropriate numeric type (int, long, ulong, float, decimal, etc.). 숫자를 구성하는 문자열 내에 공백이 있으면 오류가 발생합니다.Any white space within the string that forms the number causes an error. 예를 들어 decimal.TryParse를 사용하여 “10”, “10.3” 또는 “ 10 ”은 구문 분석할 수 있지만 이 메서드를 사용하여 “10X”, “1 0”(공백 포함), “10 .3”(공백 포함), “10e1”(float.TryParse 사용) 등에서 10을 구문 분석할 수는 없습니다.For example, you can use decimal.TryParse to parse "10", "10.3", or " 10 ", but you cannot use this method to parse 10 from "10X", "1 0" (note the embedded space), "10 .3" (note the embedded space), "10e1" (float.TryParse works here), and so on. 또한 값이 null 또는 String.Empty인 문자열이 구문 분석되지 않습니다.In addition, a string whose value is null or String.Empty fails to parse successfully. String.IsNullOrEmpty 메서드를 호출하여 구문 분석하기 전에 Null 또는 빈 문자열을 확인할 수 있습니다.You can check for a null or empty string before attempting to parse it by calling the String.IsNullOrEmpty method.

다음 예제에서는 ParseTryParse 호출이 성공하는 경우와 실패하는 경우를 모두 보여 줍니다.The following example demonstrates both successful and unsuccessful calls to Parse and TryParse.

using System;

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

        string inputString = "abc";
        if (Int32.TryParse(inputString, out int numValue))
            Console.WriteLine(inputString);
        else
            Console.WriteLine($"Int32.TryParse could not parse '{inputString}' to an int.");
        // Output: Int32.TryParse could not parse 'abc' to an int.
     }
}

다음 예제에서는 선행 숫자(16진수 문자 포함) 및 숫자가 아닌 후행 문자를 포함해야 하는 문자열을 구문 분석하는 한 가지 방법을 보여 줍니다.The following example illustrates one a approach to parsing a string that is expected to include leading numeric characters (including hexadecimal characters) and trailing non-numeric characters. TryParse 메서드를 호출하기 전에 문자열 시작 부분의 유효한 문자를 새 문자열에 할당합니다.It assigns valid characters from the beginning of a string to a new string before calling the TryParse method. 구문 분석할 문자열에 포함된 문자 수가 적으므로 예제에서는 String.Concat 메서드를 호출하여 새 문자열에 유효한 문자를 할당합니다.Because the strings to be parsed contain a small number of characters, the example calls the String.Concat method to assign valid characters to a new string. 더 큰 문자열의 경우 StringBuilder 클래스를 대신 사용할 수 있습니다.For a larger string, the StringBuilder class can be used instead.

using System;

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

변환 메서드 호출Calling the Convert methods

다음 표에는 문자열을 숫자로 변환하는 데 사용할 수 있는 Convert 클래스의 일부 메서드가 나와 있습니다.The following table lists some of the methods from the Convert class that you can use to convert a string to a number.

숫자 형식Numeric Type 메서드Method
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로 변환합니다. 예제에서는 이 메서드에서 throw할 수 있는 두 가지 가장 일반적인 예외인 FormatExceptionOverflowException을 catch합니다.The following example calls the Convert.ToInt32(String) method to convert an input string to an int. The example catches the two most common exceptions that can be thrown by this method, FormatException and OverflowException. Int32.MaxValue을 초과하지 않고 결과 숫자를 증분할 수 있는 경우 예제에서는 결과에 1을 더하고 출력을 표시합니다.If the resulting number can be incremented without exceeding Int32.MaxValue, the example adds 1 to the result and displays the output.

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

참조See also