HOWTO · Java

如何在 Java 中将整型 int 转换为字符 char

本教程介绍如何通过转换为 char、使用 Character.forDigit(),或取得 Integer.toString() 的第一个字符,将 Java 中的 int 转换为 char。

本页内容

在 Java 中,应根据 int 表示的含义选择操作:如果它表示 UTF-16 代码单元,就使用 (char) 强制转换;如果它表示某个进制中的一位数字,就使用 Character.forDigit();如果只需要十进制表示的首字符,就使用 Integer.toString()。这几种操作的结果不同,不能互换。

将 int 强制转换为 char

强制转换会把整数值视为 UTF-16 代码单元,而不会将数字格式化为十进制文本。例如,代码单元 65 对应 A。若要得到字符 1,整数必须表示该字符(例如字符字面量 '1'),或者表示 0 到 9 之间的数字,再加上 '0'。

Java 的 char 用一个 16 位 UTF-16 代码单元存储字符。将 int 强制转换为 char 会把值缩窄到这个大小,因此当输入本来就表示一个代码单元时,这种做法很有用。它不会检查取值范围:超出 char 范围的值不会报错,转换得到的代码单元也可能不是你想要的字符。如果值来自用户输入或文件,并且需要保留其原始数值含义,应在转换前进行验证。

Unicode 也需要考虑这一点。许多常见符号只需一个 char,但补充平面中的 Unicode 码点由两个 UTF-16 代码单元表示,这一对代码单元称为代理项对。一个 char 无法容纳完整的这类码点。如果数据中可能包含这些字符,请使用字符串或能处理码点的操作。对于 ASCII 十进制数字,只有在值为 0 到 9 时,加上 '0' 才有效,因为这十个数字字符的代码单元值连续排列;这并不是通用的数字转文本方法。

使用 Character.forDigit() 转换一位数字

Character.forDigit() 会将一个有效的数字值映射为指定进制中的对应字符。在十进制中,值 6 表示 '6';在十六进制中,值 12 表示 'c'。数字值必须大于或等于 0 且小于进制数,进制数则必须介于 2 和 36 之间。如果任一参数超出有效范围,该方法会返回 NUL 字符(\u0000),而不是 null。

当整数表示一位数字,而不是要打印的完整数字时,可以使用此方法。例如,十六进制的基数为 16,数字值范围是 0 到 15;值 10 到 15 会映射为字母 a 到 f。返回的字母为小写。如果输出格式要求大写十六进制,可先选择有效的数字值,再对返回的字符调用 Character.toUpperCase()。反向辅助方法 Character.digit(character, radix) 可以将进制数字字符转换回数值。

NUL 结果是值为 \u0000 的 char;它不是 Java 引用类型的 null,而且许多终端会将它显示为空白。如果输入可能来自程序外部,应自行检查进制数和数字值的范围,以免把这个结果误认为转换成功。对于 42 这样的完整数字,应使用格式化或字符串操作转换整个值,而不是只调用一次 Character.forDigit()。

获取 Integer.toString() 的首字符

Integer.toString(value).charAt(0) 会先将整数转换为十进制字符串,再仅选取第一个字符。当值为 1 时,该字符是 '1'。对于多位数,这会返回首位字符,而不是一个能表示整个数字的 char。

例如,值 42 会生成字符串 "42",因此 charAt(0) 返回 '4'。负数以负号开头,所以对于 -42 这样的值,此表达式会返回 '-'。只有当需求确实是查看或显示十进制表示的首字符时,这种做法才合适。如果需要所有数字,请保留结果为 String;单个 char 无法表示由多个字符组成的数字。

应根据输入的含义来选择方法:UTF-16 代码单元使用强制转换;指定进制中的一位数字使用 Character.forDigit();十进制文本的首字符则使用 Integer.toString() 加 charAt(0)。明确区分这些含义,就不会把数值 65 与字符串 "65" 中打印出的两个字符混为一谈。

下面的程序展示上述三种操作及相应的值,并按照介绍这些操作的顺序打印结果字符。

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