有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何处理E后面没有指数值的指数值异常

这是我在这个论坛上提出的第一个问题,所以如果问题是新手,请给出建议

我通过EditText接收用户输入,因此它是一个字符序列/字符串。然后我创建了BigDecimal来保存这个值。它处理指数也优雅,没有任何麻烦。但问题是,当用户输入像1.1E+(没有任何后续指数)这样的值时,代码在这段代码中崩溃。但是当输入是这样的1.1E+2

EditText edit_text_left;
Editable editable_val_text;
....
editable_val_text = edit_text_left.getText();
BigDecimal val = new BigDecimal((editable_val_text.toString().trim())); // crash happens here

如何处理

更多信息:你可以在谷歌单位转换应用程序中尝试,选择数字存储:PB到比特转换。输入9字节,它将在bits部分显示8.106e+16。现在尝试编辑8.106e+168.106e+,它仍然可以工作。我只想要类似的处理


共 (3) 个答案

  1. # 1 楼答案

    根据Javadoc的BigDecimal

    The exponent consists of the character 'e' ('\u0075') or 'E' ('\u0045') followed by one or more decimal digits. The value of the exponent must lie between -Integer.MAX_VALUE (Integer.MIN_VALUE+1) and Integer.MAX_VALUE, inclusive.

    IMHO你能做的是记住最后输入的指数,然后如果发生异常,如果需要这种行为,追加最后一个指数

  2. # 2 楼答案

    在我看来,你应该做的是捕捉异常(在一个包含try-catch语句中),并告诉用户他们提供了一个无效的数字

    如果想要处理非标准版本的“科学”格式,可能需要实现自己的数字解析器/转换器。可以通过从BigDecimal类中获取标准解析代码,并将其转换为理解非标准格式的静态帮助器方法来实现这一点

    或者,您可以尝试创建与非标准表单匹配的正则表达式,并使用该正则表达式将字符串更正为BigDecimal可以接受的表单

    但坦率地说,我不会这么做。如果用户能够理解科学的格式,他们也应该能够获得正确的语法

  3. # 3 楼答案

    感谢这个社区和所有回复的人。其中一个暗示给了我解决这个问题的想法。没有内置的方法来处理结尾的e/e/e-/e-/e+/e+/e+。相反,我利用了绳子。endsWith方法来识别孤独的e/e/e-/e-/e+/e+,并从字符串中删除它们

    if ((str.endsWith("e")) || (str.endsWith("E")))    {
        str1 = str.copyValueOf(str.toCharArray(), 0, str.length() - 1);
    }
    else if ((str.endsWith("e+")) || (str.endsWith("E+")) || (str.endsWith("e-")) || (str.endsWith("E-")))    {
        str1 = str.copyValueOf(str.toCharArray(), 0, str.length() - 2);
    }