C#でcharとintを変換する方法|文字コード取得・数値変換の違いを解説

はじめに

C#でcharintを変換するときは、最初に「何を目的に変換するのか」をはっきりさせることが重要です。

同じcharからintへの変換でも、次の2つは意味がまったく違います。

C#
char c = '1';

int code = (int)c; // 文字コードとしての値
int number = c - '0'; // 数値としての値

(int)'1'の結果は1ではなく49です。一方、'1' - '0'の結果は1になります。

この違いを理解しないまま実装すると、「数字に変換したつもりなのに想定外の値になる」「文字コードを扱いたいのに数値変換してしまう」といったミスが起きやすくなります。

この記事では、C#におけるcharintの変換について、文字コードの取得、数字文字の数値変換、intからcharへの変換、安全な判定方法まで整理して解説します。

1. C#のcharとint変換で最初に押さえるべき違い

C#でcharintを変換する前に、まずchar型とint型が何を表す型なのかを確認しておきましょう。

1-1. char型とは:1文字を表す値型

char型は、C#で1文字を表すための値型です。

C#
char c1 = 'A';
char c2 = '1';
char c3 = 'あ';

charはシングルクォーテーション'で囲んで表します。
文字列を表すstringとは異なり、charは基本的に1文字だけを扱います。

C#
char c = 'A';      // OK
string s = "A"; // OK

// char invalid = 'AB'; // NG:charは複数文字を表せない

C#のcharは内部的には16ビットのUnicode文字を表す型です。英字、数字、日本語などを1文字として扱えますが、絵文字など一部の文字はchar1つでは表せない場合があります。この点は後ほど注意点として解説します。

1-2. int型とは:整数を表す値型

int型は、整数を表すための値型です。

C#
int number1 = 10;
int number2 = -5;
int number3 = 0;

intは文字ではなく数値を扱います。計算、比較、ループのカウントなどでよく使われます。

C#
int a = 3;
int b = 5;

Console.WriteLine(a + b); // 8

charintはどちらも値型ですが、意味はまったく異なります。
charは「文字」、intは「整数」です。

1-3. 「文字コードを取得する変換」と「数字文字を数値にする変換」は別物

C#でcharintに変換するとき、特に混乱しやすいのが次の2つです。

C#
char c = '5';

int code = (int)c;
int value = c - '0';

この2つの結果は異なります。

C#
Console.WriteLine(code);  // 53
Console.WriteLine(value); // 5

(int)cは、文字'5'に対応する文字コードの値を取得します。
一方、c - '0'は、数字文字'5'を数値の5として取り出す方法です。

つまり、目的ごとに使う方法が変わります。

文字コードを知りたい場合は、(int)cを使います。

C#
char c = 'A';
int code = (int)c;

Console.WriteLine(code); // 65

数字文字を数値にしたい場合は、c - '0'などを使います。

C#
char c = '7';
int number = c - '0';

Console.WriteLine(number); // 7

charからintへの変換といっても、「文字コードとしての変換」なのか「数値としての変換」なのかを必ず区別しましょう。

1-4. char・string・intの変換関係を整理

charstringintの関係を整理すると、次のようになります。

C#
char c = '8';

// char → int:文字コード
int code = (int)c;

// char → int:数字としての値
int number = c - '0';

// char → string
string str = c.ToString();

// string → int
int parsed = int.Parse(str);

// int → char:文字コードから変換
char ch1 = (char)65;

// int → char:0〜9を数字文字に変換
char ch2 = (char)(8 + '0');

// int → string
string text = 123.ToString();

同じintでも、「文字コードとしての整数」なのか「数値としての整数」なのかで、charへの戻し方が変わります。

C#
char a = (char)65;        // 'A'
char digit = (char)(5 + '0'); // '5'

この違いを理解しておくと、C#でのcharintの変換ミスをかなり減らせます。

2. charをintに変換して文字コードを取得する方法

charの文字コードを取得したい場合は、charintにキャストします。

2-1. (int)charでUnicodeコードポイントを取得する

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

C#
char c = 'A';
int code = (int)c;

Console.WriteLine(code);

実行結果は次のようになります。

65

'A'の文字コードは65なので、(int)'A'65になります。

もう少し例を見てみましょう。

C#
Console.WriteLine((int)'A'); // 65
Console.WriteLine((int)'B'); // 66
Console.WriteLine((int)'a'); // 97
Console.WriteLine((int)'あ'); // 12354

このように、charintにキャストすると、その文字に対応するUnicode上の値を確認できます。

ただし厳密には、C#のcharはUnicodeの「コードポイントそのもの」ではなく、UTF-16の16ビットコード単位です。多くの一般的な文字、たとえば英数字やひらがな、漢字などはchar1つで扱えますが、絵文字など一部の文字はchar2つの組み合わせで表されることがあります。

そのため、通常の文字であれば(int)cで文字コードを確認できますが、すべてのUnicode文字を1つのcharで扱えるわけではない点には注意が必要です。

2-2. 'A'や'0'をintに変換した場合の結果

代表的な文字をintに変換すると、次のようになります。

C#
Console.WriteLine((int)'A'); // 65
Console.WriteLine((int)'Z'); // 90
Console.WriteLine((int)'a'); // 97
Console.WriteLine((int)'z'); // 122

Console.WriteLine((int)'0'); // 48
Console.WriteLine((int)'1'); // 49
Console.WriteLine((int)'9'); // 57

ここで重要なのは、'0'intにキャストしても0にはならないという点です。

C#
int result = (int)'0';

Console.WriteLine(result); // 48

(int)'0'で取得できるのは、数値の0ではなく、文字'0'の文字コードです。

同じように、(int)'1'1ではなく49です。

C#
Console.WriteLine((int)'1'); // 49

数字文字を数値にしたい場合は、キャストではなく別の方法を使う必要があります。

2-3. 日本語文字をintに変換した場合の注意点

日本語文字もcharとして扱えるため、intにキャストできます。

C#
char c = 'あ';
int code = (int)c;

Console.WriteLine(code); // 12354

漢字も同様です。

C#
Console.WriteLine((int)'日'); // 26085
Console.WriteLine((int)'本'); // 26412

ただし、日本語を含むすべての文字がchar1つで安全に扱えるとは限りません。たとえば、絵文字や一部の特殊文字はサロゲートペアと呼ばれる2つのcharで表されることがあります。

C#
string emoji = "😀";

Console.WriteLine(emoji.Length); // 2
Console.WriteLine((int)emoji[0]);
Console.WriteLine((int)emoji[1]);

この場合、emoji[0]emoji[1]はそれぞれ1つのcharですが、単独では絵文字全体を表しているわけではありません。

通常の英数字や日本語文字を扱う範囲ではcharからintへのキャストで問題ありませんが、絵文字や補助文字まで正確に扱いたい場合は、charではなくRuneなどの利用を検討する必要があります。

2-4. 文字コード取得にキャストを使うべきケース

(int)cを使うべきなのは、文字そのものを数値として計算したい場合ではなく、文字コードを確認・比較したい場合です。

たとえば、文字の並び順を調べる場合です。

C#
char c1 = 'A';
char c2 = 'B';

Console.WriteLine((int)c1); // 65
Console.WriteLine((int)c2); // 66

また、英字や数字の範囲を文字コードで判定したい場合にも使えます。

C#
char c = 'C';

if (c >= 'A' && c <= 'Z')
{
Console.WriteLine("大文字の英字です");
}

この例では明示的にintへキャストしていませんが、char同士の比較は文字コードの順序に基づいて行われます。

文字コードをログに出したい場合にも便利です。

C#
char c = 'x';

Console.WriteLine($"文字: {c}");
Console.WriteLine($"コード: {(int)c}");

出力例は次のとおりです。

文字: x
コード: 120

一方で、'3'を数値の3として扱いたいだけなら、(int)cは適切ではありません。目的が数値変換であれば、次の章で紹介する方法を使います。

3. 数字のcharをintの数値に変換する方法

数字文字を数値に変換する場合は、文字コード取得とは別の方法を使います。

たとえば、'5'5に変換したい場合です。

C#
char c = '5';
int number = c - '0';

Console.WriteLine(number); // 5

3-1. '0'を引いて0〜9の数値に変換する

数字文字'0''9'を数値の09に変換する場合、もっともシンプルな方法は'0'を引くことです。

C#
char c = '7';
int number = c - '0';

Console.WriteLine(number); // 7

なぜこれで変換できるかというと、数字文字は文字コード上で連続して並んでいるからです。

C#
Console.WriteLine((int)'0'); // 48
Console.WriteLine((int)'1'); // 49
Console.WriteLine((int)'2'); // 50
Console.WriteLine((int)'9'); // 57

'7'の文字コードは55'0'の文字コードは48です。

C#
'7' - '0' = 55 - 48 = 7

そのため、次のように数字文字を数値へ変換できます。

C#
char c = '3';

int number = c - '0';

Console.WriteLine(number); // 3

ただし、この方法は'0''9'の半角数字であることが前提です。

C#
char c = 'A';
int number = c - '0';

Console.WriteLine(number); // 17

'A' - '0'はエラーにはなりませんが、意図しない値になります。
そのため、実務では事前に範囲チェックを入れるのが安全です。

C#
char c = '8';

if (c >= '0' && c <= '9')
{
int number = c - '0';
Console.WriteLine(number);
}
else
{
Console.WriteLine("数字ではありません");
}

3-2. char.GetNumericValue()で数値を取得する

char.GetNumericValue()を使って、文字が表す数値を取得することもできます。

C#
char c = '5';

double number = char.GetNumericValue(c);

Console.WriteLine(number); // 5

char.GetNumericValue()の戻り値はintではなくdoubleです。

C#
double value = char.GetNumericValue('9');

Console.WriteLine(value); // 9

数字ではない文字を指定した場合は、-1が返ります。

C#
Console.WriteLine(char.GetNumericValue('A')); // -1

char.GetNumericValue()は、半角数字だけでなく、Unicode上で数値として扱われる文字にも対応できます。

C#
Console.WriteLine(char.GetNumericValue('5')); // 5

全角数字なども扱いたい場合には便利です。

ただし、戻り値がdoubleであること、数字ではない場合に例外ではなく-1が返ることには注意しましょう。単純に半角数字'0''9'だけを扱うなら、c - '0'の方がシンプルです。

3-3. int.Parse(char.ToString())で変換する

charをいったんstringに変換してから、int.Parse()を使う方法もあります。

C#
char c = '4';

int number = int.Parse(c.ToString());

Console.WriteLine(number); // 4

int.Parse()は文字列を整数に変換するメソッドです。
charを直接渡すのではなく、ToString()で文字列にしてから渡します。

C#
char c = '8';

string text = c.ToString();
int number = int.Parse(text);

Console.WriteLine(number); // 8

ただし、変換できない文字を指定すると例外が発生します。

C#
char c = 'A';

// FormatExceptionが発生する
int number = int.Parse(c.ToString());

そのため、入力値が不確実な場合はint.Parse()よりも、事前に判定するか、文字列に対してint.TryParse()を使う方が安全です。

C#
char c = '6';

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

3-4. それぞれの変換方法の違いと使い分け

数字のcharintに変換する方法は複数ありますが、目的によって使い分けるのがおすすめです。

半角数字'0''9'だけを扱う場合は、c - '0'がシンプルで高速です。

C#
char c = '2';
int number = c - '0';

全角数字など、Unicode上の数値文字も扱いたい場合は、char.GetNumericValue()が候補になります。

C#
char c = '5';
double number = char.GetNumericValue(c);

文字列変換の流れに合わせたい場合や、他の文字列数値変換と同じ書き方にしたい場合は、int.Parse(c.ToString())を使えます。

C#
char c = '7';
int number = int.Parse(c.ToString());

ただし、int.Parse()は変換できない文字で例外が発生するため、ユーザー入力など不確実な値には注意が必要です。

実務では、半角数字1文字を扱うなら次のような書き方が扱いやすいです。

C#
char c = '5';

if (c >= '0' && c <= '9')
{
int number = c - '0';
Console.WriteLine(number);
}
else
{
Console.WriteLine("半角数字ではありません");
}

4. intをcharに変換する方法

次に、intcharに変換する方法を見ていきます。

intからcharへの変換にも、主に2つの目的があります。

C#
char c1 = (char)65;        // 文字コード65を'A'に変換
char c2 = (char)(5 + '0'); // 数値5を数字文字'5'に変換

この2つも意味が違うため、区別して使う必要があります。

4-1. 文字コードからcharに変換する:(char)int

文字コードをcharに変換するには、intcharにキャストします。

C#
int code = 65;
char c = (char)code;

Console.WriteLine(c); // A

65'A'に対応する文字コードなので、(char)65'A'になります。

他の例も見てみましょう。

C#
Console.WriteLine((char)65);    // A
Console.WriteLine((char)66); // B
Console.WriteLine((char)97); // a
Console.WriteLine((char)12354); // あ

この方法は、文字コードから文字を作りたい場合に使います。

C#
for (int code = 65; code <= 90; code++)
{
Console.Write((char)code);
}

出力結果は次のようになります。

ABCDEFGHIJKLMNOPQRSTUVWXYZ

ただし、(char)intは「数値を数字文字にする」ための方法ではありません。
たとえば、(char)5は文字'5'にはなりません。

C#
char c = (char)5;

Console.WriteLine(c); // 制御文字のため、見た目では確認しづらい

数値の5を数字文字'5'にしたい場合は、次の方法を使います。

4-2. 0〜9の数値を数字文字に変換する:(char)(num + '0')

数値の09を数字文字の'0''9'に変換するには、'0'を足してからcharにキャストします。

C#
int num = 5;
char c = (char)(num + '0');

Console.WriteLine(c); // 5

'0'の文字コードは48なので、5 + '0'53になります。
文字コード53'5'なので、結果として数字文字'5'が得られます。

C#
for (int i = 0; i <= 9; i++)
{
char c = (char)(i + '0');
Console.WriteLine(c);
}

出力結果は次のとおりです。

0
1
2
3
4
5
6
7
8
9

ただし、この方法は09の1桁の数値に限って使うべきです。

C#
int num = 12;
char c = (char)(num + '0');

Console.WriteLine(c); // '<'

12 + '0'60になり、文字コード60'<'です。
つまり、12"12"にしたい場合にこの方法を使ってはいけません。

4-3. 10以上の数値はcharではなくstringに変換する

charは1文字を表す型です。
そのため、10123のように複数桁になる数値は、charではなくstringに変換します。

C#
int number = 123;
string text = number.ToString();

Console.WriteLine(text); // 123

charは1文字しか表せないため、次のような考え方はできません。

C#
int number = 123;

// char c = (char)number; // '1''2''3'になるわけではない

(char)123は、数値123を文字コードとして解釈した文字になります。
数値の表示形式として"123"にしたいなら、ToString()を使います。

C#
int number = 10;

string s = number.ToString();

Console.WriteLine(s); // 10

1桁の数値を数字文字にしたい場合はcharで問題ありません。

C#
int number = 7;
char c = (char)(number + '0');

Console.WriteLine(c); // 7

複数桁の数値を扱う場合はstringを使いましょう。

4-4. 範囲外のintをcharに変換する際の注意点

charは16ビットの値を扱う型です。
そのため、intからcharへ変換するときは、扱える範囲に注意が必要です。

C#
int code = 65;
char c = (char)code;

Console.WriteLine(c); // A

このように範囲内の値であれば問題ありません。

一方、負の値や大きすぎる値をcharに変換すると、意図しない結果になる可能性があります。

C#
int code = -1;
char c = (char)code;

Console.WriteLine((int)c); // 65535

charに変換する前に、範囲を確認しておくと安全です。

C#
int code = 65;

if (code >= char.MinValue && code <= char.MaxValue)
{
char c = (char)code;
Console.WriteLine(c);
}
else
{
Console.WriteLine("charに変換できる範囲外です");
}

ただし、char.MinValuechar.MaxValuechar型なので、比較をわかりやすくするためにintへキャストしてもよいです。

C#
int code = 12354;

if (code >= (int)char.MinValue && code <= (int)char.MaxValue)
{
char c = (char)code;
Console.WriteLine(c);
}
else
{
Console.WriteLine("範囲外です");
}

また、範囲内であっても、必ずしも画面に表示できる文字とは限りません。制御文字やサロゲート領域の値なども存在するため、文字として表示する目的で使う場合は注意しましょう。

5. charとint変換でよくある失敗例

ここでは、C#でcharintを変換するときによくある失敗例を紹介します。

5-1. '1'を(int)で変換すると1ではなく49になる

もっともよくあるミスが、数字文字をintにキャストしてしまうケースです。

C#
char c = '1';
int number = (int)c;

Console.WriteLine(number); // 49

'1'intにキャストすると、数値の1ではなく文字コードの49になります。

数値の1が欲しい場合は、次のように書きます。

C#
char c = '1';
int number = c - '0';

Console.WriteLine(number); // 1

または、文字列にしてからint.Parse()を使います。

C#
char c = '1';
int number = int.Parse(c.ToString());

Console.WriteLine(number); // 1

文字コードを取得したいなら(int)c、数字としての値を取得したいならc - '0'と覚えておきましょう。

5-2. 数字以外のcharに'0'を引くと意図しない値になる

c - '0'は便利ですが、対象が半角数字であることが前提です。

C#
char c = 'A';
int number = c - '0';

Console.WriteLine(number); // 17

このコードはエラーにはなりません。
しかし、'A'は数字ではないため、結果の17に数値としての意味はありません。

安全に処理するには、事前に'0''9'の範囲にあるかを判定します。

C#
char c = 'A';

if (c >= '0' && c <= '9')
{
int number = c - '0';
Console.WriteLine(number);
}
else
{
Console.WriteLine("半角数字ではありません");
}

char.IsDigit()を使う方法もありますが、char.IsDigit()は半角数字以外の数字文字もtrueになる場合があります。
c - '0'と組み合わせるなら、c >= '0' && c <= '9'のように半角数字の範囲を直接チェックする方が明確です。

5-3. char.GetNumericValue()は戻り値がdoubleになる

char.GetNumericValue()は便利ですが、戻り値がdoubleである点に注意が必要です。

C#
char c = '5';

double value = char.GetNumericValue(c);

Console.WriteLine(value); // 5

次のようにintへ直接代入することはできません。

C#
char c = '5';

// int value = char.GetNumericValue(c); // NG

intとして扱いたい場合は、結果を確認したうえでキャストします。

C#
char c = '5';

double value = char.GetNumericValue(c);

if (value >= 0)
{
int number = (int)value;
Console.WriteLine(number);
}

ただし、char.GetNumericValue()は数字ではない文字に対して-1を返します。

C#
double value = char.GetNumericValue('A');

Console.WriteLine(value); // -1

このため、-1かどうかを確認せずに使うと、意図しない処理になる可能性があります。

5-4. int.Parse()は変換できない文字で例外が発生する

int.Parse()は、変換できない文字列を指定すると例外が発生します。

C#
char c = 'A';

int number = int.Parse(c.ToString()); // FormatException

ユーザー入力や外部データなど、値が必ず数字とは限らない場合は、int.Parse()をそのまま使うのは危険です。

安全に変換したい場合は、int.TryParse()を使います。

C#
char c = 'A';

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

TryParse()は変換に失敗しても例外を投げず、falseを返します。
入力値が不確実な場面では、Parse()よりTryParse()の方が扱いやすいです。

6. 目的別:C#でcharとintを変換するおすすめの方法

ここまで紹介した方法を、目的別に整理します。

6-1. 文字コードを知りたい場合は(int)c

文字コードを取得したい場合は、(int)cを使います。

C#
char c = 'A';
int code = (int)c;

Console.WriteLine(code); // 65

この方法は、文字を数値として扱いたいのではなく、文字に対応するコード値を確認したい場合に使います。

C#
char c = 'あ';

Console.WriteLine((int)c); // 12354

ログ出力やデバッグ、文字コードの確認などに向いています。

C#
char c = 'x';

Console.WriteLine($"char: {c}, code: {(int)c}");

6-2. 数字1文字を数値にしたい場合はc - '0'

半角数字1文字を数値に変換したい場合は、c - '0'を使うのがおすすめです。

C#
char c = '6';
int number = c - '0';

Console.WriteLine(number); // 6

ただし、対象が半角数字であることを確認してから使いましょう。

C#
char c = '6';

if (c >= '0' && c <= '9')
{
int number = c - '0';
Console.WriteLine(number);
}
else
{
Console.WriteLine("半角数字ではありません");
}

この方法は、1文字ずつ数字を処理する場面でよく使われます。

C#
string text = "12345";
int sum = 0;

foreach (char c in text)
{
if (c >= '0' && c <= '9')
{
sum += c - '0';
}
}

Console.WriteLine(sum); // 15

6-3. 入力値が不確実な場合はchar.IsDigit()で判定する

入力値が数字かどうかを判定したい場合は、char.IsDigit()を使えます。

C#
char c = '8';

if (char.IsDigit(c))
{
Console.WriteLine("数字です");
}
else
{
Console.WriteLine("数字ではありません");
}

ただし、char.IsDigit()はUnicode上の数字文字を判定するため、半角数字だけを対象にする場合は注意が必要です。

C#
char c = '5';

Console.WriteLine(char.IsDigit(c)); // True

char.IsDigit()trueでも、c - '0'で正しく数値にできるとは限りません。

半角数字だけを対象にするなら、次のように判定します。

C#
if (c >= '0' && c <= '9')
{
int number = c - '0';
}

全角数字なども含めて数値を取得したい場合は、char.GetNumericValue()を使う選択肢があります。

C#
char c = '5';

double value = char.GetNumericValue(c);

Console.WriteLine(value); // 5

6-4. 文字列の数値変換ならint.TryParse()を使う

charではなくstringを数値に変換する場合は、int.TryParse()を使うのがおすすめです。

C#
string text = "123";

if (int.TryParse(text, out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("変換できません");
}

int.Parse()は変換に失敗すると例外が発生します。

C#
string text = "abc";

// int number = int.Parse(text); // FormatException

一方、int.TryParse()は失敗しても例外を投げません。

C#
string text = "abc";

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

ユーザー入力、CSV、ファイル、APIレスポンスなど、不確実な値を扱う場合はTryParse()を使うと安全です。

7. 安全に変換するためのサンプルコード

ここからは、C#でcharintを安全に変換するためのサンプルコードを紹介します。

7-1. charが数字か判定してintに変換するコード

半角数字のcharだけをintに変換する場合は、次のように書けます。

C#
static bool TryConvertDigitCharToInt(char c, out int number)
{
if (c >= '0' && c <= '9')
{
number = c - '0';
return true;
}

number = 0;
return false;
}

使用例です。

C#
char c = '7';

if (TryConvertDigitCharToInt(c, out int number))
{
Console.WriteLine($"変換結果: {number}");
}
else
{
Console.WriteLine("半角数字ではありません");
}

出力結果は次のとおりです。

変換結果: 7

数字以外を渡した場合は、変換に失敗します。

C#
char c = 'A';

if (TryConvertDigitCharToInt(c, out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("半角数字ではありません");
}

出力結果です。

半角数字ではありません

このようにメソッド化しておくと、変換可否と変換結果を安全に扱えます。

7-2. intを数字文字charに変換するコード

09の数値を数字文字charに変換する場合は、範囲チェックを入れると安全です。

C#
static bool TryConvertIntToDigitChar(int number, out char c)
{
if (number >= 0 && number <= 9)
{
c = (char)(number + '0');
return true;
}

c = '\0';
return false;
}

使用例です。

C#
int number = 5;

if (TryConvertIntToDigitChar(number, out char c))
{
Console.WriteLine($"変換結果: {c}");
}
else
{
Console.WriteLine("0〜9の範囲ではありません");
}

出力結果です。

変換結果: 5

10以上の値を渡した場合は、charではなくstringへの変換を検討します。

C#
int number = 12;

if (TryConvertIntToDigitChar(number, out char c))
{
Console.WriteLine(c);
}
else
{
string text = number.ToString();
Console.WriteLine($"stringに変換: {text}");
}

出力結果です。

stringに変換: 12

7-3. 文字コードと数値変換の結果を比較するコード

(int)cc - '0'の違いを確認するサンプルです。

C#
char[] chars = { '0', '1', '5', '9', 'A' };

foreach (char c in chars)
{
Console.WriteLine($"文字: {c}");
Console.WriteLine($"(int)c: {(int)c}");

if (c >= '0' && c <= '9')
{
Console.WriteLine($"c - '0': {c - '0'}");
}
else
{
Console.WriteLine("c - '0': 半角数字ではないため変換しません");
}

Console.WriteLine();
}

出力例です。

文字: 0
(int)c: 48
c - '0': 0

文字: 1
(int)c: 49
c - '0': 1

文字: 5
(int)c: 53
c - '0': 5

文字: 9
(int)c: 57
c - '0': 9

文字: A
(int)c: 65
c - '0': 半角数字ではないため変換しません

この結果を見ると、(int)cは文字コード、c - '0'は数字文字を数値にする処理であることがよく分かります。

7-4. 例外を避けるための実装ポイント

例外を避けるためには、変換前に判定することが重要です。

半角数字1文字を扱うなら、次のようにします。

C#
char c = '3';

if (c >= '0' && c <= '9')
{
int number = c - '0';
Console.WriteLine(number);
}
else
{
Console.WriteLine("半角数字ではありません");
}

stringを数値に変換するなら、int.TryParse()を使います。

C#
string text = "123";

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

int.Parse()を使う場合は、入力が確実に数値である場面に限定するのが安全です。

C#
string text = "456";

int number = int.Parse(text);

Console.WriteLine(number);

また、char.GetNumericValue()を使う場合は、-1が返る可能性を考慮します。

C#
char c = 'A';

double value = char.GetNumericValue(c);

if (value >= 0)
{
int number = (int)value;
Console.WriteLine(number);
}
else
{
Console.WriteLine("数値を表す文字ではありません");
}

安全に変換するための基本は、次の3つです。

変換目的を明確にすること。
対象の文字が変換可能か判定すること。
失敗する可能性がある処理ではTryParse()などを使うこと。

8. C#のcharとint変換に関するよくある質問

8-1. charをintにキャストすると何が返る?

charintにキャストすると、その文字に対応する文字コードの値が返ります。

C#
char c = 'A';
int code = (int)c;

Console.WriteLine(code); // 65

数字文字の場合も、数値そのものではなく文字コードが返ります。

C#
Console.WriteLine((int)'1'); // 49
Console.WriteLine((int)'5'); // 53

'5'を数値の5にしたい場合は、(int)'5'ではなく次のように書きます。

C#
int number = '5' - '0';

Console.WriteLine(number); // 5

8-2. '5'を数値の5に変換するには?

半角数字の'5'を数値の5に変換するには、'0'を引きます。

C#
char c = '5';
int number = c - '0';

Console.WriteLine(number); // 5

より安全に書くなら、数字かどうかを判定します。

C#
char c = '5';

if (c >= '0' && c <= '9')
{
int number = c - '0';
Console.WriteLine(number);
}
else
{
Console.WriteLine("半角数字ではありません");
}

int.Parse()を使うこともできます。

C#
char c = '5';

int number = int.Parse(c.ToString());

Console.WriteLine(number); // 5

ただし、変換できない文字では例外が発生するため、入力値が不確実な場合は注意が必要です。

8-3. int.Parseはcharに直接使える?

基本的には、charToString()で文字列に変換してからint.Parse()に渡します。

C#
char c = '7';

int number = int.Parse(c.ToString());

Console.WriteLine(number); // 7

int.Parse()は数値を表す文字列を整数に変換するメソッドです。
そのため、charを扱う場合は文字列化してから使うのが分かりやすいです。

入力値が不確実な場合は、int.TryParse()を使うと安全です。

C#
char c = 'A';

if (int.TryParse(c.ToString(), out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("変換できません");
}

8-4. ASCIIコードとUnicodeの違いは?

ASCIIは、英数字や記号、制御文字などを扱う古い文字コードの規格です。
たとえば、'A'はASCIIで65'0'48です。

C#
Console.WriteLine((int)'A'); // 65
Console.WriteLine((int)'0'); // 48

Unicodeは、英数字だけでなく、日本語、中国語、韓国語、記号、絵文字など、世界中の文字を扱うための文字集合です。

C#のcharはUnicodeに基づく文字を扱います。
ただし、C#のcharは16ビットのUTF-16コード単位であり、すべてのUnicode文字をchar1つで表せるわけではありません。

英数字については、UnicodeでもASCIIと同じ値が割り当てられています。
そのため、(int)'A'65(int)'0'48になる点はASCIIと同じです。

8-5. charとstringの変換はどう使い分ける?

charは1文字、stringは文字列を表します。

C#
char c = 'A';
string s = "A";

charstringに変換するには、ToString()を使います。

C#
char c = 'A';
string s = c.ToString();

Console.WriteLine(s); // A

stringからcharを取り出すには、インデックスを使います。

C#
string s = "ABC";

char c = s[0];

Console.WriteLine(c); // A

ただし、文字列が空の場合にs[0]を使うと例外が発生します。

C#
string s = "";

// char c = s[0]; // 例外

安全に扱うには、長さを確認します。

C#
string s = "ABC";

if (s.Length > 0)
{
char c = s[0];
Console.WriteLine(c);
}

1文字だけを扱うならchar、複数文字や数値文字列を扱うならstringを使うのが基本です。

C#
char digitChar = '7';
int digit = digitChar - '0';

string numberText = "123";
int number = int.Parse(numberText);

まとめ

C#でcharintを変換するときは、「文字コードを取得したいのか」「数字文字を数値にしたいのか」を明確にすることが重要です。

charintにキャストすると、文字コードの値が得られます。

C#
char c = 'A';
int code = (int)c;

Console.WriteLine(code); // 65

数字文字を数値にしたい場合は、(int)cではなくc - '0'を使います。

C#
char c = '5';
int number = c - '0';

Console.WriteLine(number); // 5

intcharに変換する場合も、目的によって方法が変わります。
文字コードから文字に変換するなら(char)intを使います。

C#
char c = (char)65;

Console.WriteLine(c); // A

数値の09を数字文字に変換するなら、'0'を足してからcharに変換します。

C#
int number = 5;
char c = (char)(number + '0');

Console.WriteLine(c); // 5

一方、10以上の数値はcharではなくstringに変換します。

C#
int number = 123;
string text = number.ToString();

Console.WriteLine(text); // 123

実務では、変換前の判定も重要です。
半角数字1文字かどうかを確認するなら、次のように書きます。

C#
char c = '8';

if (c >= '0' && c <= '9')
{
int number = c - '0';
Console.WriteLine(number);
}
else
{
Console.WriteLine("半角数字ではありません");
}

文字列を数値に変換する場合は、例外を避けるためにint.TryParse()を使うと安全です。

C#
string text = "123";

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

charintの変換は一見シンプルですが、文字コード変換と数値変換を混同するとバグの原因になります。
(int)cは文字コード、c - '0'は数字文字の数値化、(char)intは文字コードから文字への変換、number.ToString()は複数桁の数値を文字列にする方法として使い分けましょう。