HOWTO · Java

Java で int を char に変換する方法

このチュートリアルでは、char へのキャスト、Character.forDigit() の使用、または Integer.toString() の最初の文字を取得することによって、Java で int を char に変換する方法を示します。

このページの内容

Javaでは、intが何を表すかに応じて操作を選びます。UTF-16コード単位を表す値なら(char)でキャストし、基数における1桁の値ならCharacter.forDigit()を使います。10進表記の先頭文字が必要な場合はInteger.toString()を使います。それぞれ結果が異なるため、互換の方法として扱うことはできません。

intをcharにキャストする

キャストでは、整数値をUTF-16コード単位として扱います。数値を10進文字列に変換するわけではありません。たとえば、コード単位65はAに対応します。文字1を得るには、整数がその文字を表している必要があります(文字リテラル'1'のようにする方法があります)。または、0から9までの数字に'0'を加えます。

Javaのcharが格納できるのは、16ビットのUTF-16コード単位1つです。intからcharへのキャストでは値がその幅に切り詰められるため、入力がすでにコード単位を表している場合に適しています。これは範囲チェックではありません。charの範囲を外れた値でもエラーにはならず、意図した文字とは異なるコード単位になることがあります。ユーザー入力やファイルから値を読み取る場合、元の数値を保つ必要があればキャスト前に検証してください。

この違いはUnicodeでも重要です。よく使われる記号の多くは1つのcharに収まりますが、補助文字のUnicodeコードポイントはサロゲートペアと呼ばれる2つのUTF-16コード単位で表されます。1つのcharでは、そのコードポイント全体を保持できません。そのような文字を扱う可能性がある場合は、文字列またはコードポイントに対応した操作を使ってください。ASCIIの10進数字に'0'を加える方法が使えるのは、数字文字10個のコード単位値が連続しているため、値が0から9までの場合だけです。汎用的な数値から文字列への変換方法ではありません。

Character.forDigit()で1桁を変換する

Character.forDigit()は、有効な1桁の数値を、指定した基数に対応する文字へ変換します。基数が10なら値6は'6'に、基数が16なら値12は'c'になります。数字の値は0以上、基数未満でなければならず、基数は2から36の範囲である必要があります。どちらかの引数が有効範囲外の場合、このメソッドはnullではなくNUL文字(\\u0000)を返します。

このメソッドは、出力する数値全体ではなく、整数が1桁を表す場合に使います。たとえば、16進数の基数は16で、値0から15を使います。値10から15は文字aからfに対応し、返される英字は小文字です。出力形式で大文字の16進数が必要なら、有効な数字を選んだうえで、返された文字にCharacter.toUpperCase()を適用します。逆変換にはCharacter.digit(character, radix)を使い、基数の数字を数値に戻せます。

NULの結果は値が\\u0000であるcharであり、Javaの参照型のnullではありません。多くの端末では何も表示されないように見えます。外部から入力を受け取る場合は、基数と数字の範囲を自分で確認し、この結果を変換成功と取り違えないようにしてください。42のような数値全体を変換するには、Character.forDigit()を1回呼ぶのではなく、書式化または文字列への変換を使います。

Integer.toString()の先頭文字を取得する

Integer.toString(value).charAt(0)は、整数を10進文字列に変換して、先頭の文字だけを取り出します。値が1なら、その文字は'1'です。複数桁の値では、数値全体を表すcharではなく、先頭の文字が返されます。

たとえば、値42は文字列"42"になるため、charAt(0)は'4'を返します。負の値はマイナス記号から始まるので、-42のような値ではこの式は'-'を返します。この方法は、10進表記の先頭文字を調べたり表示したりすることが目的の場合に適しています。すべての桁が必要なら結果をStringのまま扱ってください。1つのcharでは複数文字からなる数値を表せません。

入力の意味に応じて選びます。UTF-16コード単位にはキャストを、選択した基数の1桁にはCharacter.forDigit()を、10進文字列の先頭にはInteger.toString()とcharAt(0)を使います。この違いを明確にしておけば、数値65を、文字列"65"の2文字と混同せずに済みます。

以下のプログラムでは、ここまで説明した値を使って3つの操作を示します。操作を紹介した順に、結果の文字を出力します。

public class IntToCharExample {
    public static void main(String[] args) {
        int codeUnit = 65;
        char letter = (char) codeUnit;

        int literalDigitValue = '1';
        char literalDigit = (char) literalDigitValue;
        int digit = 1;
        char addedZeroDigit = (char) (digit + '0');

        char decimalDigit = Character.forDigit(6, 10);
        char hexadecimalDigit = Character.forDigit(12, 16);

        int value = 1;
        char firstCharacter = Integer.toString(value).charAt(0);

        System.out.println(letter);
        System.out.println(literalDigit);
        System.out.println(addedZeroDigit);
        System.out.println(decimalDigit);
        System.out.println(hexadecimalDigit);
        System.out.println(firstCharacter);
    }
}
A
1
1
6
c
1