1

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

我通过 接收用户输入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 到比特转换。并以 PB 为单位键入 9,它将显示8.106e+16在位部分中。现在尝试编辑8.106e+168.106e+它仍然可以工作。我只想要类似的处理。

4

3 回答 3

2

IMO,您应该做的是捕获异常(在封闭的 try-catch 语句中)并告诉用户他们提供了无效的数字。

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

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

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

于 2013-01-02T09:03:21.983 回答
0

根据BigDecimal的 Javadoc

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

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

于 2013-01-02T09:07:41.780 回答
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);
}
于 2013-01-03T03:40:40.220 回答