charAt提取数字转整数方法详解
charAt()返回的是Unicode码点(如'0'对应48),直接赋值给int会导致得到ASCII值而非数字本身;需通过Character.digit()或Integer.parseInt()显式转换为数值。

charAt() 返回的是 Unicode 码点(如 '0' 对应 48),直接赋值给 int 会导致得到 ASCII 值而非数字本身;需通过 Character.digit() 或 Integer.parseInt() 显式转换为数值。
`charAt()` 返回的是 Unicode 码点(如 `'0'` 对应 48),直接赋值给 `int` 会导致得到 ASCII 值而非数字本身;需通过 `Character.digit()` 或 `Integer.parseInt()` 显式转换为数值。
在 Java 中,String.charAt(int index) 方法返回的是指定位置的 char 类型字符。但当你将其直接赋值给一个 int 变量(例如 int base = str.charAt(i);),Java 会自动进行隐式类型提升——将 char 按其 Unicode 码点值(即 ASCII 值)转为 int。因此,当 str = "30" 且 i = 0 时,str.charAt(0) 返回字符 '3',其 Unicode 值为 51,于是 base 被赋值为 51,而非期望的数字 3。
这是初学者在实现如“水仙花数(Armstrong 数)”等字符串数字处理逻辑时常见的误区。要真正获取字符所表示的十进制数字值,推荐以下两种安全、高效的方式:
✅ 推荐方案一:使用 Character.digit(char, radix)
int base = Character.digit(str.charAt(i), 10);
- 优点:专为字符转数字设计,性能好,对非数字字符返回 -1(可据此校验);
- 安全示例:
char c = str.charAt(i); if (!Character.isDigit(c)) { throw new IllegalArgumentException("Invalid digit character: " + c); } int base = Character.digit(c, 10);
✅ 推荐方案二:使用 Character.getNumericValue(char)
int base = Character.getNumericValue(str.charAt(i));
- 支持更广的数字字符(如阿拉伯数字、罗马数字符号等),对 '0'–'9' 行为与 digit() 一致;
- 注意:对非法字符返回 -2,需判空处理。
⚠️ 不推荐方案:Integer.parseInt(str.substring(i, i+1))
虽然可行,但存在明显缺陷:
- 创建临时 String 对象,带来不必要的内存开销;
- 若字符非数字(如 'a'),抛出 NumberFormatException,必须用 try-catch 包裹,降低可读性与性能。
? 修正后的 Armstrong 数判断核心逻辑(片段)
private static boolean isArmstrong(int number) {
String str = Integer.toString(number);
int len = str.length();
long sum = 0; // 使用 long 避免 int 溢出
for (int i = 0; i < len; i++) {
int digit = Character.digit(str.charAt(i), 10);
sum += (long) Math.pow(digit, len); // 注意:Math.pow 返回 double,建议用自定义幂函数或 BigInteger 提升精度
}
return sum == number;
}关键提醒:
- Math.pow(int, int) 返回 double,强制转 long 可能因浮点误差导致精度丢失(如 Math.pow(9, 10) 在某些 JVM 上可能为 3486784400.999...),生产环境建议改用整数幂运算(如循环乘法或 BigInteger.pow());
- 原代码中 result=+Math.pow(...) 实为 result = +Math.pow(...)(即赋值而非累加),应改为 result += ...;
- 外层循环中 number < parameter + 1 等价于 number <= parameter,语义更清晰。
掌握 char 到数字的正确转换方式,是编写健壮字符串数值处理逻辑的基础一步。


































