閉じる

【C#】文字列を数値に型変換する方法(Parse,TryParse)

ユーザーから受け取った文字は、そのままでは計算に使えません。

C#ではParseTryParseという標準メソッドで、文字列を安全に数値へ変換できます。

この記事では、両者の違いと使い方、初心者がつまずきやすい点を具体例とサンプルコード付きで丁寧に解説します。

C#の型変換の基本(文字列→数値)

文字列を数値にする目的と場面

アプリケーションでは、コンソール入力や設定ファイル、CSVやJSON、コマンドライン引数などから値を読み込むことが多いです。

これらは通常文字列で渡されるため、計算に使う前に数値型へ変換する必要があります。

代表的な変換先としてint(整数)やdouble(小数を含む実数)があり、C#ではint.Parseint.TryParsedouble.Parsedouble.TryParseを使います。

なお、お金などの厳密な小数はdecimalが向いていますが、本記事では扱いません。

ParseとTryParseの違い(ざっくり比較)

どちらも文字列→数値への変換を行いますが、失敗時の挙動と使いどころが異なります。

初心者の方はまず違いを掴むことが大切です。

観点ParseTryParse
シグネチャ例int Parse(string s)bool TryParse(string s, out int result)
戻り値変換された数値変換の成功可否(bool)
失敗時例外を投げる(FormatExceptionなど)例外を投げない。resultは0など既定値
典型用途事前検証済みで失敗しない入力ユーザー入力や外部データなど信頼できない入力
可読性簡潔安全で明示的

基本はTryParse、確実なときだけParseが合言葉です。

Parseの使い方(int.Parse, double.Parse)

基本の書き方と戻り値

Parseは、成功すれば数値を直接返します。

コードが簡潔で読みやすいのが利点です。

C#
// Parseの基本例
// .NET 6以降のトップレベル文を使用
using System;

string s1 = "123";
int n1 = int.Parse(s1);             // "123" → 123
string s2 = "3.14";
double d2 = double.Parse(s2);       // "3.14" → 3.14

Console.WriteLine($"n1 = {n1}");
Console.WriteLine($"d2 = {d2}");
実行結果
n1 = 123
d2 = 3.14

失敗時は例外になる点に注意

Parseは失敗すると例外になります。

代表的にはFormatExceptionOverflowExceptionArgumentNullExceptionです。

ユーザー入力のように失敗があり得る場合は、例外処理が必須です。

C#
// 例外の種類を知るためのサンプル
using System;

void TryParseWithExceptions(string label, string? input)
{
    Console.WriteLine($"=== {label} ===");
    try
    {
        int value = int.Parse(input!); // nullならArgumentNullException
        Console.WriteLine($"成功: {value}");
    }
    catch (FormatException)
    {
        Console.WriteLine("FormatException: 数字以外の文字が含まれています。");
    }
    catch (OverflowException)
    {
        Console.WriteLine("OverflowException: 値がintの範囲を超えています。");
    }
    catch (ArgumentNullException)
    {
        Console.WriteLine("ArgumentNullException: nullは変換できません。");
    }
}

TryParseWithExceptions("数字でない", "12ab");
TryParseWithExceptions("範囲外", "999999999999999999999"); // int範囲外
TryParseWithExceptions("null", null);
実行結果
=== 数字でない ===
FormatException: 数字以外の文字が含まれています。
=== 範囲外 ===
OverflowException: 値がintの範囲を超えています。
=== null ===
ArgumentNullException: nullは変換できません。

前後の空白や符号(+, -)の扱い

int.Parseは既定で先頭末尾の空白符号(+-)を受け付けます。

一方、1,234のような桁区切り(コンマ)は既定のint.Parse(string)では失敗します。

C#
// 空白や符号はOK、桁区切りはNGの例
using System;
using System.Globalization;

Console.WriteLine(int.Parse("   -42  ")); // 空白と符号はOK

// int.Parse("1,234"); // これはFormatException
// 桁区切りを許可したいならNumberStylesとカルチャを指定
int withThousands = int.Parse("1,234",
    NumberStyles.Integer | NumberStyles.AllowThousands,
    CultureInfo.GetCultureInfo("ja-JP"));
Console.WriteLine(withThousands); // 1234

// double.Parseは既定で小数点、指数、桁区切りを受け付けることがあります(カルチャ依存)
Console.WriteLine(double.Parse("1,234.5", CultureInfo.GetCultureInfo("en-US"))); // 1234.5
実行結果
-42
1234
1234.5

ポイント: 浮動小数点のパースはカルチャの小数点記号(日本語環境では通常ドット)に影響されます。

機械可読な固定書式を扱うときはCultureInfo.InvariantCultureの使用を検討します。

TryParseの使い方(int.TryParse, double.TryParse)

基本の書き方(out 変数とbool結果)

TryParseは、成功可否をboolで返し、結果をout引数に出力します。

例外が出ないため、安全に分岐できます。

C#
// TryParseの基本
using System;

bool ok1 = int.TryParse("123", out int n1);
bool ok2 = int.TryParse("12ab", out int n2); // 失敗 → n2は0

Console.WriteLine($"ok1={ok1}, n1={n1}");
Console.WriteLine($"ok2={ok2}, n2={n2}");
実行結果
ok1=True, n1=123
ok2=False, n2=0

失敗しても例外にならない

失敗してもfalseが返るだけで、例外は発生しません

想定内の失敗処理が書きやすくなります。

C#
// 失敗時の安全な代替処理
using System;

string input = "not-a-number";
if (int.TryParse(input, out int value))
{
    Console.WriteLine($"変換成功: {value}");
}
else
{
    Console.WriteLine("変換失敗: 既定値0を使います。");
    value = 0;
}
Console.WriteLine($"最終値: {value}");
実行結果
変換失敗: 既定値0を使います。
最終値: 0

ユーザー入力(Console.ReadLine)との組み合わせ

ユーザー入力は誤りがつきものです。

TryParseで検証し、再入力を促すのが定石です。

C#
// コンソールから年齢を安全に取得する例
using System;

while (true)
{
    Console.Write("年齢を整数で入力してください: ");
    string? line = Console.ReadLine();

    // nullや空白だけの入力を避けるためTrim
    if (!string.IsNullOrWhiteSpace(line) && int.TryParse(line.Trim(), out int age) && age >= 0)
    {
        Console.WriteLine($"ありがとうございます。年齢は {age} 歳ですね。");
        break;
    }

    Console.WriteLine("入力が正しくありません。もう一度お試しください。");
}
実行結果
年齢を整数で入力してください: 20
ありがとうございます。年齢は 20 歳ですね。

使い分けのコツとよくあるつまずき

基本はTryParse/確実なときだけParse

ユーザー入力や外部データにはTryParseを使い、失敗しないことが保証されている内部生成の文字列にのみParseを使います。

例外はコストも読みやすさも犠牲にすることがあるため、成功可否で分岐する方が保守的です。

空文字やnullは変換に失敗する

""(空文字)やnullParseで例外、TryParsefalseになります。

事前にstring.IsNullOrWhiteSpaceTrimでガードしましょう。

C#
using System;

string? s1 = "";
string? s2 = null;

// TryParseはfalse
Console.WriteLine(int.TryParse(s1, out var a)); // False
Console.WriteLine(int.TryParse(s2, out var b)); // False

// Parseは例外(コメントアウトを外すと実行時例外)
// int.Parse(s1); // FormatException
// int.Parse(s2!); // ArgumentNullException
実行結果
False
False

小数はdouble.TryParseを使う

小数点を含む値はdouble.TryParseを使います。

小数点や桁区切り、指数表記はカルチャの影響を受けます。

データ交換や設定で.固定の表記を扱うならInvariantCultureを指定すると安全です。

C#
// カルチャを指定した小数のTryParse
using System;
using System.Globalization;

string sA = "1,234.5"; // en-US想定
bool okA = double.TryParse(
    sA,
    NumberStyles.Float | NumberStyles.AllowThousands, // 小数・指数・桁区切りを許可
    CultureInfo.GetCultureInfo("en-US"),
    out double rA);

string sB = "3.14"; // InvariantCultureは常に '.' が小数点
bool okB = double.TryParse(
    sB,
    NumberStyles.Float | NumberStyles.AllowThousands,
    CultureInfo.InvariantCulture,
    out double rB);

Console.WriteLine($"okA={okA}, rA={rA}");
Console.WriteLine($"okB={okB}, rB={rB}");
実行結果
okA=True, rA=1234.5
okB=True, rB=3.14
メモ

日本語ロケール(ja-JP)では通常.が小数点、,が桁区切りです。

入力の出どころに応じて適切なカルチャ指定を選びましょう。

事前にTrimして余分な空白を除く

人手入力やテキストからの抽出では前後の空白が混入しがちです。

Trimしてから変換すると安定します。

C#
using System;

string raw = "   +42  ";
if (int.TryParse(raw.Trim(), out int number))
{
    Console.WriteLine($"成功: {number}");
}
else
{
    Console.WriteLine("失敗");
}
実行結果
成功: 42
補足

int.Parseは既定でも前後空白と符号を受け付けますが、Trimしておけば意図しない不可視文字の混入を避けやすくなります。

まとめ

文字列から数値への変換は、C#での入出力処理の基礎です。

基本方針はTryParseで安全に検証し、確実なケースのみParseという使い分けです。

空文字やnull、範囲外は失敗すること、カルチャによって小数点や桁区切りが変わることを押さえ、必要に応じてNumberStylesCultureInfoを指定してください。

実運用ではTrimで前後空白を除去し、失敗時のフォールバックを用意することで、堅牢で読みやすいコードになります。

この記事を書いた人
エーテリア編集部
エーテリア編集部

C#の入門記事を中心に、開発環境の準備からオブジェクト指向の基本まで、順を追って解説しています。ゲーム開発や業務アプリを目指す人にも役立ちます。

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

URLをコピーしました!