任务:
我从数据库获取技术数据,需要对其进行处理,以便将其放入我们需要双值的数据库中。数据库中的实体是电梯,其中包含“旅行高度,重量,......:”等技术数据。
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
?
答案 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列表中的任何一个来删除非数字值