Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将字符串转换为数字,Java_Java_String_Numbers - Fatal编程技术网

将字符串转换为数字,Java

将字符串转换为数字,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,

编辑:澄清将任何有效的数字编码从字符串转换为数字

对于所有接受的整数格式,尤其是在integer.parseInt下抛出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是一个有效整数,但会抛出数字格式异常