0

编辑解决:我很愚蠢。在一种情况下,输入字符串比我想象的要长(它们已损坏),因此一些美国数据进入欧洲测试并在两个双精度数与“。”连接在一起时导致异常。创建一个带三个小数点的字符串。将 7 更改为 8,原始代码就可以了。

对不起所有在这个问题上花时间的人。

编辑以在最后添加所有代码

我有一个 csv 文件,其中保存了欧洲十进制值,例如 12,345 我将数据解析为字符串,我的代码抛出异常。我已将其缩小到一行

这里是变量

String[] mark = line.split(",");
double wLat = 0;

这条线行不通

wLat = Double.parseDouble(mark[3] + "." + mark[4]);

这条线(对于非欧洲数据)有效

wLat = Double.parseDouble(mark[3]);

我可能在做一些愚蠢的事情,但这对谷歌来说很难,搜索 sa 也无济于事。我尝试了一个字符串生成器并追加,但 parseDouble 不适用于字符串生成器。我会很感激这方面的帮助。

艾伦

编辑:

// Read old marks
    try {
        // read all the old mark settings so we end up with the last ones
        // this will restore settings on a restart
        BufferedReader br;
        br = new BufferedReader(new FileReader(baseDir + "/StartLine/Waypoint_log.csv"));
        String line = null;

        while ((line = br.readLine()) != null) {
            String[] mark = line.split(",");

            double wLat = 0;
            double wLong = 0;
            if (mark.length > 7){ // europe
                //wLat = Double.parseDouble(mark[3] + "." + mark[4]);
                //wLong = Double.parseDouble(mark[5] + "." + mark[6]);
            }
            else{ // normal case
                wLat = Double.parseDouble(mark[3]);
                wLong = Double.parseDouble(mark[4]);        
            }
            int index = Integer.valueOf(mark[0]);

            if (wLat >= -90 && wLat <= 90 && wLong >= -180 && wLong <= 180){
                StartLine2.waypointNameArray[index] = mark[1];
                StartLine2.waypointLat[index] = wLat;
                StartLine2.waypointLong[index] = wLong;
                StartLine2.waypointSet[index]=1;
                index++;
            }
        }
        br.close();


    }
    catch (Exception e) {

        Toast toast=Toast.makeText(this, "No Marks Set",Toast.LENGTH_SHORT);
        toast.show();
    }
4

3 回答 3

0

尝试这个...

    String s = "0,1,2,56,4567890";
    String[] strings = s.split(",");
    s = strings[3] + "." + strings[4];
    System.out.println(Double.valueOf(s));
于 2013-11-09T17:53:50.867 回答
0

我是愚蠢的。在一种情况下,输入字符串比我想象的要长,因此一些美国数据进入欧洲测试并在两个双精度数与“。”连接在一起时导致异常。创建一个带三个小数点的字符串。将 7 更改为 8,原始代码就可以了。对不起所有在这个问题上花时间的人。顺便说一句,这是一个损坏的数据文件,应该有 7 个 :-)

为了以后安全起见,我将测试更改为

if (!line.contains(".")){ // europe

如果它未通过此测试,则它不是美国号码。最大的合法数字是 180,所以它永远不会得到“。” 如果不是美国型号。

于 2013-11-09T20:07:24.233 回答
0

你应该使用OutputStream。尝试使用此示例:

OutputStream baos = new ByteArrayOutputStream();
baos.write(mark[3].getBytes(), 0, mark[3].getBytes().length);
mark[3]=".";
baos.writeOneByte(mark[3].getBytes()[0]);
baos.write(mark[4].getBytes(), 0, mark[4].getBytes().length);
wLat = Double.valueOf(baos.toString());

希望这会奏效

于 2013-11-09T17:51:46.177 回答