这是我在这个论坛上提出的第一个问题,所以如果问题是新手请咨询。
我通过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+
,它仍然可以使用。我只想要类似的处理。
答案 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)
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);
}