将字符串转换为数字,Java
编辑:澄清将任何有效的数字编码从字符串转换为数字 对于所有接受的整数格式,尤其是在integer.parseInt下抛出NumberFormatException的格式,如何将字符串转换为数字(例如仅用于整数)。例如,代码将字符串转换为数字,Java,java,string,numbers,Java,String,Numbers,编辑:澄清将任何有效的数字编码从字符串转换为数字 对于所有接受的整数格式,尤其是在integer.parseInt下抛出NumberFormatException的格式,如何将字符串转换为数字(例如仅用于整数)。例如,代码 ... int i = 0xff; System.out.println(i); String s = "0xff"; System.out.println( Integer.parseInt(s) ); .... 将在第四行抛出NumberFormatException,
...
int i = 0xff;
System.out.println(i);
String s = "0xff";
System.out.println( Integer.parseInt(s) );
....
将在第四行抛出NumberFormatException,即使该字符串显然是十六进制整数的有效编码。我们可以假设我们已经知道编码是一个有效的数字,比如通过对照正则表达式检查它。还可以检查溢出(如Integer.parseInt所做的),但如果必须作为单独的步骤来完成,也可以
我可以循环遍历每一个数字并手动计算复合值,但这将非常困难。有更好的办法吗
编辑:很多人都在为hexidecimal回答这个问题,这很好,但并不是完全符合我的要求(这是我的错,我以hexidecimal为例)。我想知道是否有办法解码所有有效的java数字。Long.decode对于捕捉十六进制绝对是很棒的,但是它在
222222L
这是一个完全有效的长。我是否必须分别捕获每种不同的数字格式?我假设您已经使用正则表达式来说明它是什么类型的数字,即区分浮点数、整数等。您需要指定要解析的数字的基数:
Integer.parseInt(s,16);
如果您启动了“0x”
,以便只添加一个检查,则此操作将失败:
if (s.startsWith("0x")) {
s = s.substring(2);
}
Integer.parseInt(s,16);
编辑
作为对这不是一个十六进制特定问题的回应,我建议您编写自己的方法来解析您喜欢的所有数字格式,并在此基础上构建,这样您就不必再处理几个案例了
我会说使用regex
或创建自己的方法来验证其他格式:
public static int manualDecode(String s) throws NumberFormatException {
// Match against #####L long format
Pattern p = Pattern.compile("\\d+L"); // Matches ########L
Matcher m = p.matcher(s);
if (m.matches()) {
return Integer.decode(s.substring(0,s.length()-1));
}
// Match against that weird underscore format
p = Pattern.compile("(\\d{1,3})_((\\d{3})_)*?(\\d{3})"); // Matches ###_###_###_###_###
m = p.matcher(s);
if (m.matches()) {
String reformattedString = "";
char c;
for (int i = 0; i < s.length(); i++) {
c = s.charAt(i);
if ( c >= '0' && c <= '9') {
reformattedString += c;
}
}
return Integer.decode(reformattedString);
}
// Add as many more as you wish
throw new NumberFormatException();
}
public int parseIntExtended(String s) {
try {
return Integer.decode(s);
} catch (NumberFormatException e) {
return manualDecode(s);
}
}
public static int manualDecode(字符串s)抛出NumberFormatException{
//与L长格式的比赛
Pattern p=Pattern.compile(\\d+L);//匹配
匹配器m=匹配器p;
如果(m.matches()){
返回Integer.decode(s.substring(0,s.length()-1));
}
//匹配那个奇怪的下划线格式
p=Pattern.compile(“(\\d{1,3})\(\\d{3})\*?(\\d{3})”;//匹配项###_###_###_###_###
m=p.matcher(s);
如果(m.matches()){
字符串重新格式化=”;
字符c;
对于(int i=0;i='0'&&c你可以
System.out.println(Integer.decode(s));
我们应该这样做:
public class a{
public static void main(String[] args){
String s="0xff";
System.out.println(Integer.decode(s));
}
}
您也可以尝试使用biginger
,但是您必须先删除0x
,或者从0
中替换x
int val = new BigInteger("ff", 16).intValue(); // output 255
这有帮助吗?如果删除0x
,可以调用Integer.parseInt(s,16)
@dg123这确实有助于十六进制,但不能解决一般问题-例如,不能捕获111_111_111或1111111 L。@Blorgbeard这也不是一般的解决方案。我当然可以手动检查所有情况,尽管这看起来确实是检查十六进制数的好方法。不要将数字与数字文字混淆。后者是只是语法上的糖分。然后从字符串中删除0x。如果这样做,Parseint似乎会捕获十六进制,但它不会捕获111_111_111,这是一个有效的整数literal@en_Knight我刚刚看到你对它的编辑不是十六进制的。这是100%的方法!值得注意的是,这只适用于表示十六进制的十六进制值正整数.Ex:System.out.println(integer.decode(“0xFFFFF4”);
将抛出一个NumberFormatException
。这对于仅十六进制很好,但不会解码所有整数。例如,111_111_111是一个有效整数,但会抛出数字格式异常