ユーザーから受け取った文字は、そのままでは計算に使えません。
C#ではParse
とTryParse
という標準メソッドで、文字列を安全に数値へ変換できます。
この記事では、両者の違いと使い方、初心者がつまずきやすい点を具体例とサンプルコード付きで丁寧に解説します。
C#の型変換の基本(文字列→数値)
文字列を数値にする目的と場面
アプリケーションでは、コンソール入力や設定ファイル、CSVやJSON、コマンドライン引数などから値を読み込むことが多いです。
これらは通常文字列で渡されるため、計算に使う前に数値型へ変換する必要があります。
代表的な変換先としてint
(整数)やdouble
(小数を含む実数)があり、C#ではint.Parse
やint.TryParse
、double.Parse
やdouble.TryParse
を使います。
なお、お金などの厳密な小数はdecimalが向いていますが、本記事では扱いません。
ParseとTryParseの違い(ざっくり比較)
どちらも文字列→数値への変換を行いますが、失敗時の挙動と使いどころが異なります。
初心者の方はまず違いを掴むことが大切です。
観点 | Parse | TryParse |
---|---|---|
シグネチャ例 | int Parse(string s) | bool TryParse(string s, out int result) |
戻り値 | 変換された数値 | 変換の成功可否(bool) |
失敗時 | 例外を投げる(FormatExceptionなど) | 例外を投げない。resultは0など既定値 |
典型用途 | 事前検証済みで失敗しない入力 | ユーザー入力や外部データなど信頼できない入力 |
可読性 | 簡潔 | 安全で明示的 |
基本はTryParse、確実なときだけParseが合言葉です。
Parseの使い方(int.Parse, double.Parse)
基本の書き方と戻り値
Parse
は、成功すれば数値を直接返します。
コードが簡潔で読みやすいのが利点です。
// 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
は失敗すると例外になります。
代表的にはFormatException
、OverflowException
、ArgumentNullException
です。
ユーザー入力のように失敗があり得る場合は、例外処理が必須です。
// 例外の種類を知るためのサンプル
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)
では失敗します。
// 空白や符号は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
引数に出力します。
例外が出ないため、安全に分岐できます。
// 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
が返るだけで、例外は発生しません。
想定内の失敗処理が書きやすくなります。
// 失敗時の安全な代替処理
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で検証し、再入力を促すのが定石です。
// コンソールから年齢を安全に取得する例
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は変換に失敗する
""
(空文字)やnull
はParse
で例外、TryParse
でfalse
になります。
事前にstring.IsNullOrWhiteSpace
やTrim
でガードしましょう。
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
を指定すると安全です。
// カルチャを指定した小数の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
してから変換すると安定します。
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、範囲外は失敗すること、カルチャによって小数点や桁区切りが変わることを押さえ、必要に応じてNumberStyles
やCultureInfo
を指定してください。
実運用ではTrimで前後空白を除去し、失敗時のフォールバックを用意することで、堅牢で読みやすいコードになります。