将字符串转换为字节获取数字格式异常

时间:2017-03-18 06:46:26

标签: java

public class HelloWorld{

     public static void main(String []args){
        String str = "100.00";
        Short sObj2 = Short.valueOf(str);
        System.out.println(sObj2);
     }
}

获得以下异常:

Exception in thread "main" java.lang.NumberFormatException: For input string: "100.00"                                                                                          
        at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)                                                                                        
        at java.lang.Integer.parseInt(Integer.java:580)                                                                                                                         
        at java.lang.Short.parseShort(Short.java:118)                                                                                                                           
        at java.lang.Short.valueOf(Short.java:174)                                                                                                                              
        at java.lang.Short.valueOf(Short.java:200)                                                                                                                              
        at HelloWorld.main(HelloWorld.java:5)   

如何解决上述问题?

3 个答案:

答案 0 :(得分:2)

首先,Short不是一个字节(您的问题摘要表明您正在尝试将字符串转换为字节)。 Short保存从-32,768到32,767(含)的整数值。尝试将浮点值解析为整数数据类型会导致此异常。

如果您只想要无异常运行的代码,则以下任何一项都应该有效:

public class HelloWorld{
    public static void main(String []args){
        String str = "100";
        Short sObj2 = Short.valueOf(str);
        System.out.println(sObj2);
    }
}

第一个示例通过将字符串更改为整数值来运行它。

public class HelloWorld{
    public static void main(String []args){
        String str = "100.00";
        Double sObj2 = Double.valueOf(str);
        System.out.println(sObj2);
    }
}

第二个工作方法是将表示浮点值的字符串解析为支持浮点的变量类型。

答案 1 :(得分:1)

试试这个

String str = "100";
Short sObj2 = Short.valueOf(str);

或者想要处理小数值,

String str = "100.00";
Float fObj2 = Float.valueOf(str);

答案 2 :(得分:0)

首先,正如您的帖子标题所示,您希望将String数据类型转换为字节数据类型。这并不一定只包括显示不会产生 NumberFormatException 错误的值。我假设你真的想要使用那些特定的数据类型。

为了对事物进行小的改动,你想要从数值的字符串表示转换所有这些,这可以来自浮点数或双数据类型(" 100.00")。它是数字字符串中的小数点,在进行任何转换时会引发一些小问题,因此需要在执行任何此类操作之前进行处理。

需要考虑的一些事项:

作为字符串,您可以用您喜欢的任何格式表示您喜欢的任何数字。它可以像你想要的那样大,它可以随你想要的那么小。我甚至可以是一个虚构或不存在的数字,但最重要的是......它总是一个字符串,你可以用String数据类型做这些事情。将String数值转换为实际数值数据类型(如byte,short,integer,long,double,float等)是一个完全不同的球类游戏。一些String数值很容易转换,但有些需要更加特别注意细节。

字节数据类型是8位带符号的二进制补码整数。它的最小值为-128,最大值为127(含)。

数据类型是16位带符号的二进制补码整数。它的最小值为-32,768,最大值为32,767(含)。

int (整数)数据类型是32位带符号的二进制补码整数,其最小值为-2147483648,最大值为2147483647.

long 数据类型是64位二进制补码整数。签名长度的最小值为-9223372036854775808,最大值为9223372036854775807.。

最后,所有这四种数据类型都保持整数值,每种数据类型也保持最小值和最大值。在进行数据类型转换时,您还需要在某种程度上考虑这一点。如果要创建转换方法以从一种数据类型转换为另一种数据类型,则需要确保不要超过要转换为的数据类型的最小和最大允许值。如果您想将字节数据类型转换为数据类型或将转换为整数因为我们知道较小的将总是在更大的比赛中发挥作用但是当较大的比较较小时(字节)则不一定如此。

您的转换方法需要检查要转换的值,以确保它实际上符合所需的数据类型。 Java有常量可以帮助您完成此操作,因此您不必记住这些最小值和最大值,例如: Integer.MIN_VALUE Integer.MAX_VALUE 或< strong>字节.MIN_VALUE 字节.MAX_VALUE

在处理数字字符串时,您可能还需要确保您正在处理的字符串实际上是数字值的字符串表示形式,而不是字母数字值,例如十六进制字符串或只是一个字符串输出输入错误,而数字以外的字符以某种方式悄悄进入字符串。在我看来,字符串:&#34; 100.00&#34; 是字母数字值(由于句点)和数值的字符串表示,因为它是字符串表示的双数据类型。它真正取决于您如何处理转换方法中字符串中的句点(小数点)。

让我们再看看那个字符串值(&#34; 100.00&#34;)。你可能想要考虑的另一件事是,如果我们的字符串值是:&#34; 100.74&#34;?你想如何处理这个特定的价值?在将其转换为需要整数值的数据类型之前,是否要 向下舍入 为100或 *向上舍入为101? / p>

让我们转换值#34; 100.00&#34;的字符串表示形式。到数据类型。现在请记住,默认情况下我提供的方法总是会转换双数据类型的字符串表示(如果提供)向下,例如100.45或100.99将为100.如果你想要正确向上或向下舍入此类值,然后在可选的 roundUpDown 参数中提供布尔 true

private short StringToShort(final String input, final boolean... roundUpDown) {
    // Make sure there no dead whitespaces...
    String inputValue = input.replaceAll(" ", "");
    int i = 0;    // default return value is 0
    // If inputValue contains nothing ("") then return 0 
    if(inputValue.equals("")) { return 0; }

    // Is inputValue an actual numerical value?
    // Throws an exception if not.
    // Handles negative and decimal point...
    if (!inputValue.matches("-?\\d+(\\.\\d+)?")) {
        throw new IllegalArgumentException("\nStringToShort() Method Error!\n"
                + "The value supplied is not numeric (" + inputValue + ").\n");
    }

    // Was the optional roundUpDown argument supplied?
    boolean round = false;  // default is false
    if (roundUpDown.length > 0) { round = roundUpDown[0]; }

    // Convert the String to a Integer value
    if (inputValue.contains(".")) {
        // Must be a double type representation supplied
        Double value = Double.parseDouble(inputValue);
        if (round) { i = (int) Math.round(value); }
        else { i = (int) value.intValue(); }
    }
    else {
        // Must be a Integer type representation supplied
        i = Integer.parseInt(inputValue);
    }

    // Is the Integer value now too small or too 
    // large to be a Short data type?
    if (i > Short.MAX_VALUE || i < Short.MIN_VALUE) {
        throw new IllegalArgumentException("\nStringToShort() Method Error!\n"
                + "The value supplied is too small or too large (" + inputValue + ").\n"
                + "Only values from " + Short.MIN_VALUE + " to " + Short.MAX_VALUE 
                + " are allowed!\n");
    }

    // Finally, cast and return a short data type...
    return (short) i;
}

如果您阅读了代码中的所有评论,就会发现我们已经涵盖了上述所有问题。现在,根据你的帖子标题,你想转换为字节。嗯,它几乎是一样的方法,但是可能做了大约五个小的改动,看看你是否能发现它们:

private byte StringToByte(final String input, final boolean... roundUpDown) {
    // Make sure there no dead whitespaces...
    String inputValue = input.replaceAll(" ", "");
    int i = 0;    // default return value is 0
    // If inputValue contains nothing ("") then return 0 
    if(inputValue.equals("")) { return 0; }

    // Is inputValue an actual numerical value?
    // Throws an exception if not.
    // Handles negative and decimal point...
    if (!inputValue.matches("-?\\d+(\\.\\d+)?")) {
        throw new IllegalArgumentException("\nStringToByte() Method Error!\n"
                + "The value supplied is not numeric (" + inputValue + ").\n");
    }

    // Was the optional roundUpDown argument supplied?
    boolean round = false;  // default is false
    if (roundUpDown.length > 0) { round = roundUpDown[0]; }

    // Convert the String to a Integer value
    if (inputValue.contains(".")) {
        // Must be a double type representation supplied
        Double value = Double.parseDouble(inputValue);
        if (round) { i = (int) Math.round(value); }
        else { i = (int) value.intValue(); }
    }
    else {
        // Must be a Integer type representation supplied
        i = Integer.parseInt(inputValue);
    }

    // Is the Integer value now too small or too 
    // large to be a Byte data type?
    if (i > Byte.MAX_VALUE || i < Byte.MIN_VALUE) {
        throw new IllegalArgumentException("\nStringToByte() Method Error!\n"
                + "The value supplied is too small or too large (" + inputValue + ").\n"
                + "Only values from " + Byte.MIN_VALUE + " to " + Byte.MAX_VALUE 
                + " are allowed!\n");
    }

    // Finally, cast and return a byte data type...
    return (byte) i;
}