如何处理指数值的异常,E尾随无指数值

时间:2013-01-02 08:55:56

标签: java exception bigdecimal exponent

这是我在这个论坛上提出的第一个问题,所以如果问题是新手请咨询。

我通过EditText收到用户输入,因此它是一个charsequence / string。然后我创建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

如何处理?

更多信息:您可以在谷歌单元转换应用中尝试此操作,方法是选择数字存储:petabyte to bits转换。并在petabyte中键入9,它将在位部分显示8.106e+16。现在尝试将8.106e+16修改为8.106e+,它仍然可以使用。我只想要类似的处理。

3 个答案:

答案 0 :(得分:2)

IMO,你应该做的是 catch 异常(在一个封闭的try-catch语句中)并告诉用户他们提供的号码无效。

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

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

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

答案 1 :(得分:0)

根据Javadoc的BigDecimal

  

指数由字符'e'('\ u0075')或'E'('\ u0045')后跟一个或多个十进制数字组成。指数的值必须介于-Integer.MAX_VALUE (Integer.MIN_VALUE+1)Integer.MAX_VALUE之间。

恕我直言你可以做的是记住最后输入的指数,然后如果发生异常,如果需要这种行为,则追加最后一个指数。

答案 2 :(得分:0)

感谢这个社区和所有回复的人。其中一个暗示给了我一个解决问题的想法。没有内置的方法来处理结束e / E / e- / E- / e + / E +。而是我利用String.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);
}