昨天看新人写代码,从文本框读个年龄,写了句int age = (int)输入字符,编译直接红了。他以为强制转换就能变数字,结果拿到的是一串编码值,页面上显示完全不对。
字符转数字在java里分好几种情况,单个字符、字符串、带空格的编号,写法全不一样。用错方法,轻则NumberFormatException,重则 silently 拿到错误结果,查半天查不出来。
单个字符变数字:记得减去字符零
如果你手里是个char,比如字符5,想变成整数5,不能直接强转。直接(int)字符5拿到的是53,那是Unicode码点。正确姿势是c - 字符0,也就是c减48。加个判断更稳,先确认c在字符0到字符9之间,否则就是非法输入。
还有人用Character.getNumericValue(c),这个也能拿到5,还能处理罗马数字这类怪字符。日常表单校验用c减字符0就够了,可读性好,速度也快。
字符串变整数:valueOf和parseInt选一个
- 纯数字串:用Integer.parseInt(s.trim()),前后空格先去掉
- 可能为空:先判空再转,空串直接转会抛NumberFormatException
- 超大数字:超int范围就换Long.parseLong或BigDecimal,别硬转
char c = s.charAt(0); int d = c - '0'; int age = Integer.parseInt(s.trim()); long big = Long.parseLong(s.trim()); double money = Double.parseDouble(s.trim());这里代码里用了单引号的字符零,实际项目里就这么写。字符串那几行,trim很关键,用户从Excel粘过来的数字常带空格和换行,不trim必报错。再往外包一层try catch,抓住NumberFormatException给用户提示请输入数字,比直接500友好得多。
小数和金额别用float硬转,精度会飘。用Double.parseDouble做展示可以,算钱就上BigDecimal,构造时传字符串,别传double,否则精度坑还在。
取舍很明确。单个字符用减法,整数字串用parseInt,长串用Long,钱用BigDecimal。先校验再转换,比到处try省事多了。