閉じる

【C#】文字列から数値へParse変換する方法

C#では、ユーザー入力やファイルから読み込んだ文字列数値に変換する場面が非常に多くあります。

本記事では、その中でももっともよく使われるParseによる変換に焦点を当て、実務で困らないための使い方や注意点を、サンプルコード付きで詳しく解説します。

C#における文字列から数値への変換の全体像

文字列から数値への主な変換方法

C#で文字列を数値に変換する主な方法は次の3つです。

1つ目はParseメソッドです。

厳格に「正しい形式の文字列のみを受け付け、失敗したら例外を投げる」方法であり、本記事の主役です。

2つ目はTryParseメソッドです。

変換結果をboolで返し、失敗しても例外を出さないため、ユーザー入力のバリデーションなどで多用されます。

3つ目はConvert.ToInt32などConvertクラスのメソッドです。

nullを0にするなどの振る舞いがあり、Parseとは少し性質が異なります。

本記事では、このうち各数値型のParseメソッドの使い方を中心に解説していきます。

Parseメソッドの基本的な位置づけ

C#では、ほとんどの数値型がParseメソッドを持っています

代表的なものを挙げると次のようになります。

  • int.Parse(string)
  • long.Parse(string)
  • float.Parse(string)
  • double.Parse(string)
  • decimal.Parse(string)

いずれも「文字列を受け取り、その型の値に変換する」静的メソッドという共通点がありますので、一度基本形を理解してしまえば、他の型にも応用できます。

Parseの基本構文と最もシンプルな使い方

Parseの基本構文

もっとも基本的な書き方は次のとおりです。

C#
// 文字列からintへ変換する最もシンプルな例
string text = "123";          // 数値に変換したい文字列
int value = int.Parse(text);  // Parseでintに変換

Console.WriteLine(value);     // 123 が出力される

上記のように、対象とする数値型のParseを呼び出し、引数に変換元の文字列を渡すだけで基本的な処理は完了します。

実行結果
123

よく使う基本的な数値型でのParse例

int.Parseの例

C#
using System;

class Program
{
    static void Main()
    {
        string text = "42";          // 整数を表す文字列
        int number = int.Parse(text);// intに変換

        Console.WriteLine(number);   // 42
    }
}
実行結果
42

double.Parseの例

C#
using System;
using System.Globalization;

class Program
{
    static void Main()
    {
        string text = "3.14";              // 小数点を含む文字列
        double pi = double.Parse(text);    // doubleに変換

        Console.WriteLine(pi);             // 3.14
    }
}
実行結果
3.14

このように型名が変わっても基本的な使い方は同じです。

Parse使用時に必ず押さえておきたい注意点

無効な文字列は例外になる

Parseの最大の特徴は「変換に失敗すると例外が発生する」ことです。

例えば、数字以外の文字が混ざっているとFormatExceptionになります。

C#
using System;

class Program
{
    static void Main()
    {
        string text = "123abc";  // 数字以外の文字が含まれている

        // これは例外(FormatException)が発生します
        int value = int.Parse(text);

        Console.WriteLine(value);
    }
}

このコードを実行すると、途中でFormatExceptionが発生し、プログラムが異常終了します。

業務アプリケーションでは例外を適切に捕捉するか、TryParseを利用して事前にチェックすることが重要です。

例外の主な種類

Parseで発生しうる主な例外は、次の2つです。

  • FormatException
    文字列の形式が不正な場合(例: “abc”、”123abc”、空文字など)
  • OverflowException
    値がその型の範囲を超えている場合(例:int.Parse("999999999999"))

次のサンプルで、Overflowの例を確認します。

C#
using System;

class Program
{
    static void Main()
    {
        string text = "999999999999"; // intの範囲を超える値

        // これはOverflowExceptionが発生します
        int value = int.Parse(text);

        Console.WriteLine(value);
    }
}

このようにParseは「必ず成功する前提」で使うメソッドであり、ユーザー入力のように不正値が混ざる可能性がある場合は、後述するTryParseの方が安全です。

Int32.Parse(string)の基本とバリエーション

int.Parseのもっとも基本的なパターン

C#
using System;

class Program
{
    static void Main()
    {
        string text = "100";
        int value = int.Parse(text);   // "100" → 100

        Console.WriteLine($"value = {value}");
    }
}
実行結果
value = 100

整数の文字列を整数型に変換するのがint.Parseの役割です。

トリミングやプラス記号を含む文字列

int.Parseは、次のようなケースは許容します。

C#
using System;

class Program
{
    static void Main()
    {
        string text1 = "  123  "; // 前後に空白
        string text2 = "+456";    // 先頭にプラス
        string text3 = "-789";    // 先頭にマイナス

        int v1 = int.Parse(text1);
        int v2 = int.Parse(text2);
        int v3 = int.Parse(text3);

        Console.WriteLine(v1);  // 123
        Console.WriteLine(v2);  // 456
        Console.WriteLine(v3);  // -789
    }
}
実行結果
123
456
-789

このように、前後の空白や先頭の符号は問題なく解釈されることを覚えておくと便利です。

NumberStylesとCultureInfoを使った高度なint.Parse

int.Parseには、NumberStylesCultureInfoを指定できるオーバーロードもあります。

例えば"1,234"のようなカンマ区切りを許可したい場合は、次のように書きます。

C#
using System;
using System.Globalization;

class Program
{
    static void Main()
    {
        string text = "1,234"; // カンマ区切りの数値

        // NumberStyles.AllowThousandsを指定してカンマを許可する
        int value = int.Parse(
            text,
            NumberStyles.AllowThousands,
            CultureInfo.InvariantCulture
        );

        Console.WriteLine(value); // 1234
    }
}
実行結果
1234

標準のint.Parse(string)では"1,234"はエラーになるため、会計システムなどでカンマ付き数値を扱う際は、このオーバーロードを使うことが重要です。

double.Parse / decimal.Parse で小数を扱う

double.Parseの基本

C#
using System;

class Program
{
    static void Main()
    {
        string text = "12.34";
        double value = double.Parse(text);

        Console.WriteLine(value); // 12.34
    }
}
実行結果
12.34

小数点を含む数値はdouble.Parseまたはdecimal.Parseを使って変換します。

decimal.Parseの特徴

decimal金額や精度が重要な値でよく使われます。

浮動小数点誤差を避けたい場合はdecimal.Parseを利用します。

C#
using System;

class Program
{
    static void Main()
    {
        string priceText = "1234.56";
        decimal price = decimal.Parse(priceText);

        Console.WriteLine(price); // 1234.56
    }
}
実行結果
1234.56

金額計算など誤差を許容できない場面ではdoubleよりdecimalと覚えておくとよいです。

小数点の記号とカルチャ(CultureInfo)

小数点記号と桁区切り記号はカルチャによって異なります

日本や英語圏では"1,234.56"ですが、ドイツなどでは"1.234,56"のように逆になります。

この違いはCultureInfoで制御できます。

C#
using System;
using System.Globalization;

class Program
{
    static void Main()
    {
        string usText = "1,234.56";
        string deText = "1.234,56";

        // 米国カルチャ
        var us = new CultureInfo("en-US");
        // ドイツカルチャ
        var de = new CultureInfo("de-DE");

        double usValue = double.Parse(usText, us);
        double deValue = double.Parse(deText, de);

        Console.WriteLine(usValue); // 1234.56
        Console.WriteLine(deValue); // 1234.56
    }
}
実行結果
1234.56
1234.56

国際化対応が必要なアプリケーションでは、カルチャを明示してParseを呼び出すことが非常に重要です。

安全な変換にはTryParseの併用を検討する

ParseとTryParseの違い

ユーザー入力など、常に正しい形式とは限らない文字列を扱う場合はParseだけでは危険です。

そのような場合に便利なのがTryParseです。

int.TryParseのサンプル

C#
using System;

class Program
{
    static void Main()
    {
        Console.Write("数値を入力してください: ");
        string input = Console.ReadLine();

        // TryParseは変換できたかどうかをboolで返す
        bool success = int.TryParse(input, out int value);

        if (success)
        {
            Console.WriteLine($"変換に成功しました: {value}");
        }
        else
        {
            Console.WriteLine("数値として認識できませんでした。");
        }
    }
}

実行例1(入力が”123″の場合):

実行結果
数値を入力してください: 123
変換に成功しました: 123

実行例2(入力が”abc”の場合):

実行結果
数値を入力してください: abc
数値として認識できませんでした。

例外を発生させずにバリデーションができるため、実務ではTryParseが使われることが多いです。

ただし、Parseの仕組みを理解しておくと、TryParseも自然に理解できるようになります。

ParseとConvert.ToXxxの違い

Convert.ToInt32との比較

Convert.ToInt32などのメソッドは、内部的にParseを利用していることが多いですが、nullの扱いなどが異なります。

次の表に簡単に違いをまとめます。

メソッドnullのとき不正な文字列のとき備考
int.ParseArgumentNullExceptionFormatException変換失敗は例外
Convert.ToInt320FormatExceptionnullを0に変換
int.TryParsefalse(return)false(return)例外を出さずに結果だけ返す

「nullの場合は0」という仕様が欲しい場合はConvert.ToInt32を使うと楽なことがありますが、意図しない0が紛れ込むリスクもあるため、仕様として明確に決めてから使うことが大切です。

実務でのおすすめパターン

基本方針

実務では、次のような方針を取ると安全です。

1. 自分で生成した文字列や設定値など「形式が保証されている」場合Parseを使い、形式がおかしければ例外で検知する

2. ユーザー入力や外部からのデータなど「不正値の可能性がある」場合TryParseでバリデーションし、エラー表示や再入力を促す

設定値をParseで読み込む例

C#
using System;

class Program
{
    static void Main()
    {
        // アプリの設定値など、プログラム側で管理する値
        string maxRetryText = "3"; // 設定ファイルから読み込んだと想定

        // 設定ファイルのフォーマットが壊れていれば例外で気付ける
        int maxRetry = int.Parse(maxRetryText);

        Console.WriteLine($"最大リトライ回数: {maxRetry}");
    }
}
実行結果
最大リトライ回数: 3

このように「壊れてはいけない情報」については、あえてParseで例外を発生させる設計も有効です。

まとめ

本記事では、C#で文字列から数値へ変換するParseメソッドについて解説しました。

int.Parsedouble.Parseなど基本的な使い方から、NumberStylesやCultureInfoを使ったカンマ区切り・小数点の扱いまで確認しました。

また、Parseは失敗時に例外を発生させるため、ユーザー入力にはTryParseを併用することが重要であることも紹介しました。

変換の前提条件や入力元の信頼性に応じて、Parse、TryParse、Convertを使い分けることで、堅牢で分かりやすいコードを書くことができます。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!