0

解決済みの編集: 私は愚かです。あるケースでは、入力文字列が思ったよりも長かった (破損していた) ため、米国のデータの一部がヨーロッパのテストに送られ、2 つの double が "." で連結されたときに例外が発生しました。小数点以下 3 桁の文字列を作成します。7 を 8 に変更し、元のコードは問題ありません。

この問題に時間を費やしてくれたすべての人に申し訳ありません。

最後にすべてのコードを追加するように編集

たとえば 12,345 などのヨーロッパの 10 進数値が保存されている csv ファイルがあります。データを解析して文字列にすると、コードで例外がスローされます。1行に絞りました

ここに変数があります

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

この行は機能しません

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

この行(ヨーロッパ以外のデータの場合)は機能します

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

私はおそらく愚かなことをしていますが、これはGoogleにとって難しく、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

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 に答える
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

私は愚かです。あるケースでは、入力文字列が思ったよりも長かったため、一部の米国のデータがヨーロッパのテストに送られ、2 つの double が "." で連結されたときに例外が発生しました。小数点以下 3 桁の文字列を作成します。7 を 8 に変更し、元のコードは問題ありません。この問題に時間を費やしてくれたすべての人に申し訳ありません。ちなみに、それは破損したデータファイルでした.7はうまくいったはずです:-)

将来的に安全にするために、テストを次のように変更しました

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

このテストに失敗した場合、それは米国の番号ではありません。有効な最大数は 180 であるため、「.」は取得されません。US タイプ番号でない場合。

于 2013-11-09T20:07:24.233 に答える