Tro*_*roy 2 java type-conversion
我从用户那里得到一个字符串然后做一些检查以确保它是有效的,这是我一直在使用的代码;
char digit= userInput.charAt(0) - '0';
Run Code Online (Sandbox Code Playgroud)
这一直工作正常,直到我对另一种方法做了一些工作,我去编译并从那时起一直收到"可能的精度损失"错误.
我究竟做错了什么?
首先,您应该使用这些Character
方法而不是本土解决方案,即Character.isDigit()
检查有效性和Character.digit()
获取值:
char c = ...
if (Character.isDigit(c)) {
// it's a digit
}
int value = Character.digit(c, 10);
Run Code Online (Sandbox Code Playgroud)
为什么你得到这个警告是说明5.6.2二元数值提升从Java语言规范:
当运算符将二进制数字提升应用于一对操作数时,每个操作数必须表示数值类型的值,以下规则按顺序应用,使用扩展转换(第5.1.2节)根据需要转换操作数:
- 如果任一操作数是类型
double
,则另一个操作数转换为double
.- 否则,如果任一操作数是类型
float
,则另一个操作数转换为float
.- 否则,如果任一操作数是类型
long
,则另一个操作数转换为long
.- 否则,两个操作数都将转换为类型
int
.
所以发生的事情是当你进行减法时,两个参数都被提升为int
s.结果是int
.当您尝试将其分配int
给a时char
,可能会丢失精度(32位签名为16位无符号).
另一种验证技术就是使用正则表达式:
if (s.matches("\\d\\d-\\d\\d")) {
// it's ##-##
}
Run Code Online (Sandbox Code Playgroud)
或者,如果你需要抓住这些组:
Pattern p = Pattern.compile("(\\d\\d)-(\\d\\d)");
Matcher m = p.matcher(s);
if (m.matches()) {
System.out.println(m.group(1)); // first group
System.out.println(m.group(1)); // second group
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1616 次 |
最近记录: |