方法: 文字列を数値に変換する (C# プログラミング ガイド)How to: Convert a String to a Number (C# Programming Guide)

さまざまな数値型 (intlongdouble など) にある 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")). IConvertible を実装している一般的なオブジェクトでは、Convert メソッドを使用するのがより便利です。Using a Convert method is more useful for general objects that implement IConvertible.

文字列に含まれていると思われる数値型 (System.Int32 型など) の Parse または TryParse メソッドを使用できます。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 では例外がスローされるのに対し、TryParse では false が返されます。If the string is not in a valid format, Parse throws an exception, whereas TryParse returns false. Parse メソッドを呼び出すときに、常に例外処理を使用して、解析操作が失敗した場合に FormatException をキャッチする必要があります。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

文字列の先頭と末尾の空白文字は、Parse および TryParse メソッドによって無視されますが、その他のすべての文字は、適切な数値型 (intlongulongfloatdecimal など) を形成する文字である必要があります。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. たとえば、"10"、"10.3"、または " 10 " を解析するために decimal.TryParse を使用することはできますが、"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.

次の例は、Parse および TryParse の呼び出しの成功例と失敗例の両方を示しています。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 進数文字を含む)、末尾に数字以外の文字を含むと予想される文字列を解析する 1 つのアプローチを示しています。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 に変換します。例では、このメソッドからスローされる可能性のある最も一般的な 2 種類の例外 (FormatExceptionOverflowException) をキャッチします。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