C#でParseIntは使える?int.Parse・TryParse・Convert.ToInt32の違いと安全な数値変換方法

はじめに

C#で文字列を整数に変換しようとして「parseInt」「ParseInt」と検索する人は多いですが、結論から言うと、C#にはJavaScriptのようなグローバル関数としてのparseInt()は存在しません。

C#で文字列をintに変換する場合は、主に次の3つを使います。

C#
int.Parse("123");
int.TryParse("123", out int value);
Convert.ToInt32("123");

どれも「文字列や値を整数に変換する」ために使えますが、失敗したときの挙動、nullを渡したときの挙動、安全性が異なります。

特に実務では、ユーザー入力、フォーム値、CSV、APIレスポンス、設定ファイルなど、必ずしも正しい数値だけが入ってくるとは限りません。そのため、単に変換できるかだけでなく、「変換に失敗してもアプリが落ちない書き方」を知っておくことが重要です。

この記事では、C#におけるParseIntの正体、int.Parseint.TryParseConvert.ToInt32の違い、安全な数値変換パターンを、コード例付きで解説します。

1. C#でParseIntは使える?結論から解説

1-1. C#にはparseInt関数は存在しない

C#には、JavaScriptのようにそのまま呼び出せるparseInt()関数はありません。

そのため、次のように書くとコンパイルエラーになります。

C#
var number = parseInt("123"); // エラー

C#では、文字列を整数に変換するときはint.Parseint.TryParseを使います。intはC#における整数型で、実体としては.NETのSystem.Int32に対応します。Microsoftの公式ドキュメントでも、Int32.ParseInt32.TryParseは「文字列の数値表現を32ビット符号付き整数に変換する」ためのメソッドとして定義されています。

正しくは、次のように書きます。

C#
int number = int.Parse("123");

または、安全性を重視するなら次のように書きます。

C#
if (int.TryParse("123", out int number))
{
Console.WriteLine(number);
}

1-2. C#でParseIntの代わりに使う主な方法

C#でparseIntの代わりに使う主な方法は、次の3つです。

C#
int value1 = int.Parse("123");

bool success = int.TryParse("123", out int value2);

int value3 = Convert.ToInt32("123");

それぞれの特徴は次のとおりです。

int.Parseは、文字列が必ず整数として正しいと分かっている場合に使います。失敗すると例外が発生します。

int.TryParseは、変換できるかどうか分からない値に使います。失敗しても例外を出さず、trueまたはfalseで結果を返します。

Convert.ToInt32は、文字列だけでなく、doubleboolobjectなど、さまざまな型からintへ変換したい場合に使えます。ただし、nullを渡すと0になるという独特の挙動があります。

1-3. JavaScriptやJavaのparseIntとの違い

「C# parseint」で検索する人の多くは、JavaScriptやJavaの経験がある場合があります。

JavaScriptでは、次のようにparseInt()を使えます。

JavaScript
parseInt("123", 10); // 123
parseInt("1.9", 10); // 1
parseInt("abc", 10); // NaN

JavaScriptのparseInt()は、文字列を指定した基数で解釈して整数を返します。また、"1.9"のような文字列では小数点以降を切り捨てるような挙動をします。変換できない場合は例外ではなくNaNを返します。

Javaでは、次のようにInteger.parseInt()を使います。

Java
int number = Integer.parseInt("123");

JavaのInteger.parseInt(String)は、文字列を符号付き10進整数として解析します。変換できない文字列の場合はNumberFormatExceptionが発生します。

一方、C#では次のように書きます。

C#
int number = int.Parse("123");

C#にはparseInt()という名前の関数はなく、int.Parseまたはint.TryParseを使うのが基本です。

1-4. 「c# parseint」で検索する人が知りたいこと

「c# parseint」で検索する人が知りたいことは、主に次の4つです。

C#でparseIntのような関数が使えるのか。

文字列をintに変換するにはどう書けばよいのか。

int.Parseint.TryParseConvert.ToInt32のどれを使えばよいのか。

変換エラーを防ぐにはどうすればよいのか。

結論として、C#でJavaScriptのparseIntに最も近い基本的な書き方はint.Parseです。ただし、実務で安全に使うなら、多くの場合はint.TryParseが第一候補になります。

2. C#で文字列をintに変換する基本

2-1. int.Parseとは

int.Parseは、文字列をint型に変換するメソッドです。

C#
int number = int.Parse("123");
Console.WriteLine(number); // 123

文字列が正しい整数であれば、問題なくintに変換できます。

ただし、次のような値を渡すと例外が発生します。

C#
int.Parse("abc");
int.Parse("");
int.Parse(null);
int.Parse("999999999999999999999");

int.Parseは、渡された文字列がnullの場合はArgumentNullException、形式が正しくない場合はFormatExceptionintの範囲を超える場合はOverflowExceptionを発生させます。

2-2. int.TryParseとは

int.TryParseは、文字列をintに変換できるか試すメソッドです。

C#
bool success = int.TryParse("123", out int number);

if (success)
{
Console.WriteLine(number); // 123
}

変換に成功するとtrueを返し、out引数に変換後の値が入ります。変換に失敗するとfalseを返します。

C#
bool success = int.TryParse("abc", out int number);

Console.WriteLine(success); // False
Console.WriteLine(number); // 0

int.TryParseは、変換に失敗しても例外を投げません。公式ドキュメントでも、TryParseParseに似ていますが、変換失敗時に例外をスローしないため、無効な文字列に対するFormatExceptionを調べるための例外処理が不要になると説明されています。

2-3. Convert.ToInt32とは

Convert.ToInt32は、指定した値をintに変換するメソッドです。

C#
int number = Convert.ToInt32("123");
Console.WriteLine(number); // 123

文字列だけでなく、doubleboolなども変換できます。

C#
Console.WriteLine(Convert.ToInt32(12.7)); // 13
Console.WriteLine(Convert.ToInt32(true)); // 1
Console.WriteLine(Convert.ToInt32(false)); // 0

Convert.ToInt32の特徴は、nullを渡したときに例外ではなく0を返す点です。

C#
string text = null;
int number = Convert.ToInt32(text);

Console.WriteLine(number); // 0

Convert.ToInt32(string)は、文字列がnullの場合に0を返すと定義されています。

2-4. まず覚えるべき使い分けの結論

最初に覚えるべき使い分けはシンプルです。

文字列が必ず整数だと分かっているなら、int.Parse

文字列が整数かどうか分からないなら、int.TryParse

null0として扱いたい、または文字列以外の型も変換したいなら、Convert.ToInt32

特に、ユーザー入力や外部データを扱う場合はint.TryParseを使うのが安全です。

3. int.Parseの使い方と注意点

3-1. int.Parseの基本構文

int.Parseの基本構文は次のとおりです。

C#
int value = int.Parse(stringValue);

例を見てみましょう。

C#
string text = "100";
int number = int.Parse(text);

Console.WriteLine(number); // 100

int.Parseは、文字列が正しい整数形式であることを前提に変換します。

3-2. 数値文字列をintに変換するサンプルコード

次のコードでは、文字列"250"intに変換しています。

C#
string priceText = "250";
int price = int.Parse(priceText);

Console.WriteLine(price + 50); // 300

文字列のままだと、数値計算ではなく文字列結合になってしまう場合があります。

C#
string priceText = "250";

Console.WriteLine(priceText + 50); // 25050

int.Parseで数値に変換すれば、計算として扱えます。

C#
int price = int.Parse(priceText);

Console.WriteLine(price + 50); // 300

3-3. null・空文字・数値以外で発生する例外

int.Parseでは、渡す値によって異なる例外が発生します。

C#
string value1 = null;
int.Parse(value1); // ArgumentNullException
C#
string value2 = "";
int.Parse(value2); // FormatException
C#
string value3 = "abc";
int.Parse(value3); // FormatException
C#
string value4 = "999999999999999999999";
int.Parse(value4); // OverflowException

代表的な例外は次の3つです。

ArgumentNullExceptionは、引数がnullのときに発生します。

FormatExceptionは、文字列の形式が整数として正しくないときに発生します。

OverflowExceptionは、値がintの範囲を超えているときに発生します。

C#のintは32ビット符号付き整数であり、扱える範囲には上限と下限があります。その範囲を超える数値文字列は、整数形式としては正しく見えてもintには変換できません。

3-4. int.Parseを使ってよいケース

int.Parseを使ってよいのは、値が必ず正しい整数であると保証できるケースです。

たとえば、次のような場面です。

C#
string fixedValue = "10";
int count = int.Parse(fixedValue);

アプリ内部で固定された文字列を変換する場合や、事前にバリデーション済みの値を変換する場合はint.Parseでも問題ありません。

一方で、ユーザーが入力した値、CSVやExcelから読み込んだ値、Web APIから取得した値、クエリ文字列、フォーム値などは、正しい整数とは限りません。そのような場合はint.TryParseを使う方が安全です。

4. int.TryParseの使い方と安全な変換方法

4-1. int.TryParseの基本構文

int.TryParseの基本構文は次のとおりです。

C#
bool success = int.TryParse(stringValue, out int result);

変換に成功した場合はtrue、失敗した場合はfalseが返ります。

C#
string text = "123";

if (int.TryParse(text, out int number))
{
Console.WriteLine($"変換成功: {number}");
}
else
{
Console.WriteLine("変換失敗");
}

out int numberには、変換に成功した場合の整数値が入ります。

4-2. 変換に成功した場合・失敗した場合の書き方

成功時と失敗時の処理を分ける基本形は次のとおりです。

C#
string input = "100";

if (int.TryParse(input, out int number))
{
Console.WriteLine(number * 2);
}
else
{
Console.WriteLine("数値を入力してください。");
}

入力値が"100"なら、変換に成功して200が表示されます。

入力値が"abc"なら、変換に失敗してエラーメッセージを表示できます。

C#
string input = "abc";

if (int.TryParse(input, out int number))
{
Console.WriteLine(number * 2);
}
else
{
Console.WriteLine("数値を入力してください。");
}

このように、TryParseを使えば、例外で処理を止めずに自然な分岐を書けます。

4-3. 例外を出さずに安全に数値変換する方法

ユーザー入力を安全に変換するなら、基本的には次の形を使います。

C#
Console.Write("年齢を入力してください: ");
string input = Console.ReadLine();

if (int.TryParse(input, out int age))
{
Console.WriteLine($"年齢は{age}歳です。");
}
else
{
Console.WriteLine("年齢は整数で入力してください。");
}

このコードなら、ユーザーが"20"と入力すれば成功します。

一方、"abc""""20.5"のような値を入力しても、アプリが例外で落ちることはありません。

4-4. ユーザー入力やフォーム値の変換にTryParseが向いている理由

ユーザー入力やフォーム値では、次のような値が入る可能性があります。

"123"
""
"abc"
"12.5"
"1,000"
null
" 123 "

int.Parseでこれらをそのまま処理すると、値によって例外が発生します。

一方、int.TryParseなら、変換できるかどうかを判定できます。

C#
string input = "abc";

if (!int.TryParse(input, out int number))
{
Console.WriteLine("整数ではありません。");
return;
}

Console.WriteLine(number);

int.TryParseは、入力チェックと変換を同時に行えるため、Webフォーム、API、バッチ処理、CSV読み込みなどで非常によく使われます。

5. Convert.ToInt32の使い方と特徴

5-1. Convert.ToInt32の基本構文

Convert.ToInt32の基本構文は次のとおりです。

C#
int value = Convert.ToInt32(value);

文字列を変換する例です。

C#
string text = "123";
int number = Convert.ToInt32(text);

Console.WriteLine(number); // 123

数値型から変換することもできます。

C#
double rate = 12.7;
int number = Convert.ToInt32(rate);

Console.WriteLine(number); // 13

5-2. nullを変換したときの挙動

Convert.ToInt32の大きな特徴は、nullを渡すと0を返すことです。

C#
string text = null;
int number = Convert.ToInt32(text);

Console.WriteLine(number); // 0

これはint.Parseとは異なります。

C#
string text = null;
int number = int.Parse(text); // ArgumentNullException

null0として扱いたい場合には便利ですが、注意も必要です。

本来は「未入力」や「値なし」として扱うべきnullが、意図せず0になってしまう可能性があるからです。

たとえば、年齢や数量でnull0を区別したい場合、Convert.ToInt32を使うと区別できなくなります。その場合はint?TryParseを使う方が適しています。

5-3. 小数やboolを変換したときの挙動

Convert.ToInt32は、小数やboolも変換できます。

C#
Console.WriteLine(Convert.ToInt32(12.3)); // 12
Console.WriteLine(Convert.ToInt32(12.7)); // 13
Console.WriteLine(Convert.ToInt32(true)); // 1
Console.WriteLine(Convert.ToInt32(false)); // 0

boolの場合、true1false0になります。

小数の場合は、単純な切り捨てではなく、最も近い整数へ丸められます。さらに、ちょうど中間の値では偶数側に丸められます。たとえば、4.545.56になります。

C#
Console.WriteLine(Convert.ToInt32(4.5)); // 4
Console.WriteLine(Convert.ToInt32(5.5)); // 6

この挙動は、JavaScriptのparseInt("1.9")1になるのとは異なります。C#で小数を切り捨てたい場合は、Convert.ToInt32ではなく、Math.Truncateやキャストを検討します。

C#
double value = 12.9;

int truncated = (int)value;
Console.WriteLine(truncated); // 12

5-4. Convert.ToInt32を使うべきケース

Convert.ToInt32が向いているのは、次のようなケースです。

null0として扱ってよい場合。

object型の値をintに変換したい場合。

booldoubleなど、文字列以外の型から変換したい場合。

たとえば、データベースやDataTableから取得した値がobjectとして返ってくる場合に使われることがあります。

C#
object value = "123";
int number = Convert.ToInt32(value);

Console.WriteLine(number); // 123

ただし、入力値が不正な文字列の場合はFormatExceptionが発生します。

C#
Convert.ToInt32("abc"); // FormatException

安全に変換したい場合は、Convert.ToInt32よりもint.TryParseを優先しましょう。

6. int.Parse・TryParse・Convert.ToInt32の違いを比較

6-1. 変換失敗時の挙動の違い

int.Parseは、変換に失敗すると例外を発生させます。

C#
int.Parse("abc"); // FormatException

int.TryParseは、変換に失敗しても例外を発生させず、falseを返します。

C#
bool success = int.TryParse("abc", out int number);

Console.WriteLine(success); // False
Console.WriteLine(number); // 0

Convert.ToInt32は、不正な文字列では例外を発生させます。

C#
Convert.ToInt32("abc"); // FormatException

つまり、失敗する可能性がある値を扱うなら、int.TryParseが最も安全です。

6-2. nullを渡したときの違い

nullを渡したときの挙動は大きく異なります。

C#
string text = null;

int.Parse(text); // ArgumentNullException
int.TryParse(text, out int n); // false
Convert.ToInt32(text); // 0

int.Parseは例外を発生させます。

int.TryParsefalseを返します。

Convert.ToInt320を返します。

この違いは実務で重要です。nullを「値なし」として扱いたいのか、「0」として扱いたいのかによって、使うメソッドを選ぶ必要があります。

6-3. 例外処理が必要かどうかの違い

int.ParseConvert.ToInt32は、変換に失敗する可能性がある場合、必要に応じてtry-catchで例外処理を書く必要があります。

C#
try
{
int number = int.Parse("abc");
}
catch (FormatException)
{
Console.WriteLine("数値形式ではありません。");
}

一方、int.TryParseなら、通常のif文で処理できます。

C#
if (int.TryParse("abc", out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("数値形式ではありません。");
}

ユーザー入力のように失敗が通常起こり得る処理では、例外処理よりもTryParseの方が読みやすく、意図も明確です。

6-4. 実務でのおすすめ使い分け

実務では、次の使い分けがおすすめです。

内部的に固定された正しい数値文字列ならint.Parse

ユーザー入力、フォーム値、CSV、APIレスポンスならint.TryParse

null0として扱ってよい場合や、さまざまな型から変換したい場合はConvert.ToInt32

迷った場合は、まずint.TryParseを選ぶと安全です。

6-5. 比較表で見る3つの変換方法

方法成功時失敗時nullの場合向いているケース
int.Parseintを返す例外例外必ず整数と分かっている文字列
int.TryParsetrueと変換値falsefalseユーザー入力・外部データ
Convert.ToInt32intを返す例外0nullを0扱いしたい場合、型変換

この表だけを見ると、最も安全なのはint.TryParseです。ただし、常にTryParseだけを使うべきというわけではありません。値の性質に応じて使い分けることが大切です。

7. C#の数値変換でよくあるエラーと対処法

7-1. FormatExceptionの原因と対処法

FormatExceptionは、文字列の形式が整数として正しくない場合に発生します。

C#
int.Parse("abc");  // FormatException
int.Parse("12.5"); // FormatException
int.Parse(""); // FormatException

対処法は、int.TryParseを使うことです。

C#
string input = "abc";

if (!int.TryParse(input, out int number))
{
Console.WriteLine("整数を入力してください。");
}

また、入力前後の空白が原因であれば、Trim()で取り除くこともできます。

C#
string input = " 123 ";
int number = int.Parse(input.Trim());

ただし、int.Parseint.TryParseは前後の空白を許容できます。問題になりやすいのは、カンマ、小数点、全角文字、単位付き文字列などです。

7-2. ArgumentNullExceptionの原因と対処法

ArgumentNullExceptionは、int.Parsenullを渡したときに発生します。

C#
string input = null;
int number = int.Parse(input); // ArgumentNullException

対処法としては、事前にnullチェックを行います。

C#
string input = null;

if (input != null)
{
int number = int.Parse(input);
}

または、TryParseを使います。

C#
string input = null;

if (int.TryParse(input, out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("数値に変換できません。");
}

TryParseなら、nullでも例外にならずfalseになります。

7-3. OverflowExceptionの原因と対処法

OverflowExceptionは、数値がintの範囲を超えた場合に発生します。

C#
int.Parse("999999999999999999999"); // OverflowException

intで扱える範囲を超える可能性がある場合は、longを使います。

C#
string input = "9999999999";

if (long.TryParse(input, out long number))
{
Console.WriteLine(number);
}

ただし、最終的にintに収めたい場合は、範囲チェックを行います。

C#
string input = "9999999999";

if (long.TryParse(input, out long value) &&
value >= int.MinValue &&
value <= int.MaxValue)
{
int number = (int)value;
Console.WriteLine(number);
}
else
{
Console.WriteLine("intの範囲外です。");
}

7-4. 全角数字・空白・カンマ区切りで失敗する場合

数値に見えても、次のような文字列は変換に失敗することがあります。

C#
int.Parse("120");  // 全角数字
int.Parse("1,000"); // カンマ区切り
int.Parse("120円"); // 単位付き

カンマ区切りを許可したい場合は、NumberStyles.AllowThousandsを使います。

C#
using System.Globalization;

string input = "1,000";

if (int.TryParse(input, NumberStyles.AllowThousands, CultureInfo.InvariantCulture, out int number))
{
Console.WriteLine(number); // 1000
}

全角数字を扱いたい場合は、入力値を半角に正規化してから変換する方法があります。

C#
string input = "123";

string normalized = input
.Replace('0', '0')
.Replace('1', '1')
.Replace('2', '2')
.Replace('3', '3')
.Replace('4', '4')
.Replace('5', '5')
.Replace('6', '6')
.Replace('7', '7')
.Replace('8', '8')
.Replace('9', '9');

if (int.TryParse(normalized, out int number))
{
Console.WriteLine(number); // 123
}

実務では、入力値の仕様を決めておくことが重要です。たとえば「カンマは許可する」「単位は入力させない」「全角数字は半角へ変換する」など、ルールを明確にすると変換エラーを減らせます。

7-5. 小数文字列をintに変換したい場合

"12.5"のような小数文字列は、int.Parseや通常のint.TryParseでは変換できません。

C#
int.Parse("12.5"); // FormatException

小数文字列を整数にしたい場合は、まずdoubledecimalとして変換し、その後で丸めや切り捨てを行います。

C#
string input = "12.5";

if (decimal.TryParse(input, out decimal decimalValue))
{
int number = (int)Math.Truncate(decimalValue);
Console.WriteLine(number); // 12
}

四捨五入したい場合は、Math.Roundを使います。

C#
string input = "12.5";

if (decimal.TryParse(input, out decimal decimalValue))
{
int number = (int)Math.Round(decimalValue);
Console.WriteLine(number);
}

重要なのは、「小数を切り捨てたいのか」「四捨五入したいのか」「小数は入力エラーにしたいのか」を先に決めることです。

8. 実務で使える安全な数値変換パターン

8-1. ユーザー入力をintに変換するコード例

ユーザー入力を扱う場合は、int.TryParseを使います。

C#
Console.Write("数量を入力してください: ");
string input = Console.ReadLine();

if (int.TryParse(input, out int quantity))
{
Console.WriteLine($"数量: {quantity}");
}
else
{
Console.WriteLine("数量は整数で入力してください。");
}

この書き方なら、入力値が不正でもアプリが落ちません。

8-2. nullや空文字を許容するコード例

nullや空文字を許容し、未入力として扱いたい場合は、先にチェックします。

C#
string input = "";

if (string.IsNullOrWhiteSpace(input))
{
Console.WriteLine("未入力です。");
}
else if (int.TryParse(input, out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("整数ではありません。");
}

string.IsNullOrWhiteSpaceを使うと、null、空文字、空白だけの文字列をまとめて判定できます。

8-3. デフォルト値を設定して変換するコード例

変換に失敗した場合にデフォルト値を使いたい場合は、次のように書けます。

C#
string input = "abc";

int number = int.TryParse(input, out int parsed)
? parsed
: 0;

Console.WriteLine(number); // 0

デフォルト値を1にしたい場合は、次のようにします。

C#
string input = "abc";

int number = int.TryParse(input, out int parsed)
? parsed
: 1;

Console.WriteLine(number); // 1

ページ番号、表示件数、リトライ回数などでは、このようなデフォルト値付きの変換がよく使われます。

8-4. nullable intに変換するコード例

nullや空文字の場合はnull、数値ならintとして扱いたい場合は、int?を使います。

C#
string input = "";

int? number = int.TryParse(input, out int parsed)
? parsed
: null;

Console.WriteLine(number.HasValue ? number.Value : "null");

ただし、このコードは"abc"のような不正な文字列もnullになります。

未入力と不正入力を区別したい場合は、次のように書きます。

C#
string input = "abc";

int? number = null;

if (string.IsNullOrWhiteSpace(input))
{
number = null;
}
else if (int.TryParse(input, out int parsed))
{
number = parsed;
}
else
{
Console.WriteLine("整数として正しくありません。");
}

8-5. 共通メソッド化して再利用する方法

数値変換を何度も書く場合は、共通メソッド化すると便利です。

C#
static int ToIntOrDefault(string input, int defaultValue = 0)
{
return int.TryParse(input, out int value) ? value : defaultValue;
}

使い方は次のとおりです。

C#
int page = ToIntOrDefault("3", 1);
int size = ToIntOrDefault("abc", 20);

Console.WriteLine(page); // 3
Console.WriteLine(size); // 20

nullable intに変換する共通メソッドも作れます。

C#
static int? ToNullableInt(string input)
{
if (string.IsNullOrWhiteSpace(input))
{
return null;
}

return int.TryParse(input, out int value) ? value : null;
}

使い方です。

C#
int? age = ToNullableInt("25");
int? empty = ToNullableInt("");

Console.WriteLine(age); // 25
Console.WriteLine(empty); // null

入力値の扱いをプロジェクト内で統一したい場合、共通メソッド化は有効です。

9. C#のParseIntに関するよくある質問

9-1. C#でparseIntと書くとエラーになるのはなぜ?

C#にはparseInt()というグローバル関数がないためです。

JavaScriptでは次のように書けます。

JavaScript
parseInt("123", 10);

しかし、C#では次のように型のメソッドとして呼び出します。

C#
int.Parse("123");

安全に変換したい場合は、次のようにします。

C#
int.TryParse("123", out int number);

C#では、int.Parseint.TryParseConvert.ToInt32を使うと覚えておきましょう。

9-2. 文字列が数値かどうか判定するには?

文字列が整数かどうか判定するには、int.TryParseを使います。

C#
string input = "123";

if (int.TryParse(input, out int number))
{
Console.WriteLine("整数です。");
}
else
{
Console.WriteLine("整数ではありません。");
}

判定だけしたい場合でも、TryParseを使うのが一般的です。

C#
bool isNumber = int.TryParse(input, out _);

out _を使うと、変換後の値を使わずに成功・失敗だけを判定できます。

9-3. int以外のlong・double・decimalにもParseは使える?

使えます。

C#
long longValue = long.Parse("12345678900");
double doubleValue = double.Parse("12.34");
decimal decimalValue = decimal.Parse("12.34");

TryParseもあります。

C#
long.TryParse("12345678900", out long longValue);
double.TryParse("12.34", out double doubleValue);
decimal.TryParse("12.34", out decimal decimalValue);

金額のように誤差を避けたい数値にはdecimalがよく使われます。

C#
string priceText = "1234.56";

if (decimal.TryParse(priceText, out decimal price))
{
Console.WriteLine(price);
}

大きな整数を扱う場合はlong、小数を扱う場合はdoubledecimalを検討しましょう。

9-4. TryParseとtry-catchはどちらを使うべき?

入力値が不正になることが普通にあり得るなら、TryParseを使うべきです。

C#
if (int.TryParse(input, out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("整数ではありません。");
}

一方、try-catchは、通常は起きない例外的な状況を処理するために使います。

C#
try
{
int number = int.Parse(input);
}
catch (FormatException)
{
Console.WriteLine("形式が正しくありません。");
}

ユーザー入力の失敗は「例外的な異常」ではなく、通常の入力パターンとして起こり得ます。そのため、フォームやAPIの入力チェックではTryParseの方が自然です。

9-5. 文字列から数値への変換で最も安全な方法は?

最も安全な基本形は、int.TryParseです。

C#
if (int.TryParse(input, out int number))
{
// 変換成功
}
else
{
// 変換失敗
}

TryParseなら、null、空文字、数値以外、範囲外の値でも例外でアプリが落ちにくくなります。

ただし、カンマ区切りやカルチャ依存の形式を扱う場合は、NumberStylesCultureInfoを指定する必要があります。

C#
using System.Globalization;

string input = "1,000";

if (int.TryParse(input, NumberStyles.AllowThousands, CultureInfo.InvariantCulture, out int number))
{
Console.WriteLine(number);
}

安全性を高めるには、単にTryParseを使うだけでなく、どの形式を許可するかを明確にすることが大切です。

まとめ

C#には、JavaScriptのようなparseInt()関数は存在しません。C#で文字列をintに変換する場合は、int.Parseint.TryParseConvert.ToInt32を使います。

int.Parseは、文字列が必ず整数であると分かっている場合に向いています。ただし、null、空文字、数値以外、範囲外の値では例外が発生します。

int.TryParseは、変換に成功したかどうかをtrueまたはfalseで返します。例外を出さずに安全に変換できるため、ユーザー入力、フォーム値、CSV、APIレスポンスなど、外部から来る値に向いています。

Convert.ToInt32は、文字列だけでなく、doubleboolなどさまざまな型をintに変換できます。ただし、null0に変換するため、null0を区別したい場合には注意が必要です。

使い分けの結論は次のとおりです。

やりたいことおすすめ
確実に整数の文字列を変換したいint.Parse
変換できるか分からない値を安全に扱いたいint.TryParse
nullを0として扱いたい、または複数の型から変換したいConvert.ToInt32

実務で迷った場合は、まずint.TryParseを選ぶのがおすすめです。C#で「ParseIntのような処理」をしたいときは、単にint.Parseに置き換えるだけでなく、入力値の安全性まで考えて適切な変換方法を選びましょう。