C#でcharとintを変換する方法|文字コード取得・数値変換の違いを解説
はじめに
C#でcharとintを変換するときは、最初に「何を目的に変換するのか」をはっきりさせることが重要です。
同じcharからintへの変換でも、次の2つは意味がまったく違います。
C#char c = '1';
int code = (int)c; // 文字コードとしての値
int number = c - '0'; // 数値としての値
(int)'1'の結果は1ではなく49です。一方、'1' - '0'の結果は1になります。
この違いを理解しないまま実装すると、「数字に変換したつもりなのに想定外の値になる」「文字コードを扱いたいのに数値変換してしまう」といったミスが起きやすくなります。
この記事では、C#におけるcharとintの変換について、文字コードの取得、数字文字の数値変換、intからcharへの変換、安全な判定方法まで整理して解説します。
1. C#のcharとint変換で最初に押さえるべき違い
C#でcharとintを変換する前に、まず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
charとintはどちらも値型ですが、意味はまったく異なります。charは「文字」、intは「整数」です。
1-3. 「文字コードを取得する変換」と「数字文字を数値にする変換」は別物
C#でcharをintに変換するとき、特に混乱しやすいのが次の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の変換関係を整理
char、string、intの関係を整理すると、次のようになります。
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#でのcharとintの変換ミスをかなり減らせます。
2. charをintに変換して文字コードを取得する方法
charの文字コードを取得したい場合は、charをintにキャストします。
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
このように、charをintにキャストすると、その文字に対応する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'を数値の0〜9に変換する場合、もっともシンプルな方法は'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. それぞれの変換方法の違いと使い分け
数字のcharをintに変換する方法は複数ありますが、目的によって使い分けるのがおすすめです。
半角数字'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に変換する方法
次に、intをcharに変換する方法を見ていきます。
intからcharへの変換にも、主に2つの目的があります。
C#char c1 = (char)65; // 文字コード65を'A'に変換
char c2 = (char)(5 + '0'); // 数値5を数字文字'5'に変換
この2つも意味が違うため、区別して使う必要があります。
4-1. 文字コードからcharに変換する:(char)int
文字コードをcharに変換するには、intをcharにキャストします。
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')
数値の0〜9を数字文字の'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
ただし、この方法は0〜9の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文字を表す型です。
そのため、10や123のように複数桁になる数値は、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.MinValueとchar.MaxValueはchar型なので、比較をわかりやすくするために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#でcharとintを変換するときによくある失敗例を紹介します。
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#でcharとintを安全に変換するためのサンプルコードを紹介します。
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に変換するコード
0〜9の数値を数字文字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)cとc - '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にキャストすると何が返る?
charをintにキャストすると、その文字に対応する文字コードの値が返ります。
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に直接使える?
基本的には、charをToString()で文字列に変換してから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";
charをstringに変換するには、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#でcharとintを変換するときは、「文字コードを取得したいのか」「数字文字を数値にしたいのか」を明確にすることが重要です。
charをintにキャストすると、文字コードの値が得られます。
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
intをcharに変換する場合も、目的によって方法が変わります。
文字コードから文字に変換するなら(char)intを使います。
C#char c = (char)65;
Console.WriteLine(c); // A
数値の0〜9を数字文字に変換するなら、'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("数値に変換できません");
}
charとintの変換は一見シンプルですが、文字コード変換と数値変換を混同するとバグの原因になります。(int)cは文字コード、c - '0'は数字文字の数値化、(char)intは文字コードから文字への変換、number.ToString()は複数桁の数値を文字列にする方法として使い分けましょう。

