2016-06-06 10 views
3

Ich habe eine Methode Unterschied zwischen zwei Latitude zu berechnen:java.lang.NumberFormatException: Unzulässige Doppel

public static double distanceKM(LatLng latLng1, LatLng latLng2) { 
    int EARTH_RADIUS_KM = 6371; 
    double lat1Rad = Math.toRadians(latLng1.latitude); 
    double lat2Rad = Math.toRadians(latLng2.latitude); 
    double deltaLonRad = Math.toRadians(latLng2.longitude - latLng1.longitude); 

    double dist_travelled = Math 
      .acos(Math.sin(lat1Rad) * Math.sin(lat2Rad) + Math.cos(lat1Rad) 
        * Math.cos(lat2Rad) * Math.cos(deltaLonRad)) 
      * EARTH_RADIUS_KM; 

    dist_travelled = Double.parseDouble(new DecimalFormat("##.######") 
      .format(dist_travelled)); 

    return dist_travelled; 

} 

Manchmal ist diese Methode throw Exception (ich sage manchmal, wenn ich in defference Gerät testen):

java.lang.NumberFormatException: Ungültige double: "0,179927" bei java.lang.StringToReal.invalidReal (StringToReal.java:63) bei java.lang.StringToReal.parseDouble (StringToReal.java:269)

Kann mir in diesem Fall jemand helfen? Danke

+0

Ihr dist_travelled Wert enthält, (Komma) überprüfen Sie Ihre dist_travelled richtig –

+0

Aber ich dist_travelled Format (Doppel mit Typ ##. ####),. nicht, warum, wenn ich wieder formatiere,. wechseln zu , ? –

+0

müssen Sie nicht erneut konvertieren. aber Sie müssen überprüfen, warum dist_travelled gibt, (Komma) –

Antwort

3

Der Wert des Double hängt von der Sprache des Geräts ab. Zum Beispiel für Geräte in Französisch die Nummer 0,179927 wird 0,179927, die immer eine NumberFormatException werfen, wenn es zu double wegen des Kommas zu analysieren.

Sie müssen den Separator von comma in point ändern. Sie können das Trennzeichen ändern, indem Sie entweder ein Gebietsschema festlegen oder DecimalFormatSymbols verwenden.

Wenn Sie die Gruppierung Separator, um einen Punkt wollen, können Sie eine europäische Sprache verwenden:

NumberFormat nf = NumberFormat.getNumberInstance(Locale.GERMAN); 
DecimalFormat df = (DecimalFormat)nf; 

Alternativ können Sie die DecimalFormatSymbols-Klasse verwenden, um die Symbole zu ändern, die von in den formatierten Zahlen erscheinen durch die format Methode. Diese Symbole sind das Dezimaltrennzeichen, die Gruppierung Separator, das Minuszeichen, und das Prozentzeichen, unter anderem:

DecimalFormatSymbols otherSymbols = new DecimalFormatSymbols(currentLocale); 
otherSymbols.setDecimalSeparator(','); 
otherSymbols.setGroupingSeparator('.'); 
DecimalFormat df = new DecimalFormat(formatString, otherSymbols);