将具有指数数字格式的字符串转换为double会导致NumberFormatException

时间:2016-11-24 12:59:19

标签: java parsing double

任务:

我从数据库获取技术数据,需要对其进行处理,以便将其放入我们需要双值的数据库中。数据库中的实体是电梯,其中包含“旅行高度,重量,......:”等技术数据。

source-db以指数数字格式给出strings,即: 2.8300000000000000E+04

然后,我接受此字符串并将其转换为Double,如下所示:

public Double getDoubleNumberFromJSONString(String inputValue) {
        return Double.valueOf(inputValue);
}

输出:28.300(现在是双倍)

问题:

大部分时间我的方法都有效,但有时source-db不提供指数数字,但是这样的事情:

2,200.0 mm ...所以非指数数字和单位。这导致NumberFormatException

我不知道如何处理这个问题,因为源输入实际上可能差异很大:

1.000 kg ... kg 1.000 ... mm 2,000 ... 350 ... 350.0 ... 350,0 ..

由于我们的数据库需要双格式编号,因此只需转发源编号即可。

我的解决方案方法:

如果字符串实际上可能是instanceof,我尝试使用Double来检查:

public Object getDoubleNumberFromJSONString(String inputValue) {
    // FIXME Throws an error
    if(Double.valueOf(inputValue) instanceof Double){
        return Double.valueOf(inputValue);
    }
    else{
        System.out.println("Had to return inputValue in DoubleNumber()! Crash?");
        return inputValue;
    }
}

但是Double.valueOf(inputValue)已经抛出NumberFormatException,所以我不知道如何处理这种情况。

问题:

如何正确地将输入解析为Double

2 个答案:

答案 0 :(得分:1)

感谢Julien Lopez' proposal in the comments我能够让它按预期工作!

所以这是我构建的解决方案:

SELECT c.id, COUNT(DISTINCT d.student_id) FROM contract c,  (
    SELECT student_id FROM ilc_course ic, contract_seat cs2
        WHERE c.id = cs2.contract
        AND cs2.id = ic.contract_seat
        AND ic.valid = 1 AND cs2.valid = 1
        AND (ic.finished IS NULL OR ic.finished > CURRENT_TIMESTAMP)
    UNION
    SELECT student_id FROM glc_to_user_profile_student gtups, glc_course gc, contract_seat cs2
        WHERE c.id = cs2.contract
        AND gtups.contract_seat = cs2.id AND gtups.glc_course = gc.id
        AND gtups.valid = 1 AND gc.valid = 1 AND cs2.valid = 1
        AND (gtups.left_date IS NULL OR gtups.left_date > CURRENT_TIMESTAMP)
        AND (gc.end_date IS NULL OR gc.end_date > CURRENT_TIMESTAMP)
) d GROUP BY c.id;

首先,该方法尝试将输入字符串从指数数字格式转换为double。

如果失败,则抛出public Double getDoubleNumberFromJSONString(String inputValue) { try { return Double.valueOf(inputValue); } catch (NumberFormatException e) { Scanner sc = new Scanner(inputValue); double value1 = sc.nextDouble(); sc.close(); return value1; } }

然后我使用扫描仪扫描字符串以获得双值并返回。

我已接受我的问题作为Julien Lopez提案的副本,因为那里的解决方案非常适用于我的问题。我回答了我自己的问题作为一个工作的例子。

答案 1 :(得分:0)

可以考虑使用ASCII代码进行字符串操作。 字符数组 - >过滤器 - >转换为Double(可能是中间字符序列)

//inside for loop:
if(((int)character[i]>=48 && (int)character[i] <= 57)|| ((int)character[i]==46))
{ //get these elements to new character sequence maintaining the position.
} //when coming out of this block it contains only numerical values.

如果您关注实例化新内存,您可以使用ADT列表中的任何一个来删除非数字值