2012-03-26 2 views
0

ich bin Parsen eine Zeichenfolge, die wie folgt aussieht:Parsen eine Zeichenfolge, die eine Zahl zu erhalten und immer unterschiedliche Ergebnisse

POINT(-96.795894101604 46.911266990766) 

wenn ich die 2 Zahlen aus analysieren, i unterschiedliche Werte erhalten, basierend auf, wenn ich ein verwenden Doppel- oder [NSNumber numberWithDouble:]

-(void)parseGPSValue:(NSMutableString *)GPSString 
{ 
    NSRange prefixMatch = [GPSString rangeOfString:@"("]; 
    NSRange midMatch = [GPSString rangeOfString:@" "]; 
    NSRange sufixMatch = [GPSString rangeOfString:@")"]; 

    //parses the GPS coords; NSMakeRange takes starting location and range 
    double latitude = [[GPSString substringWithRange:NSMakeRange((prefixMatch.location + 1), ((midMatch.location - 0) - (prefixMatch.location + 1)))] doubleValue]; 
    double longitude = [[GPSString substringWithRange:NSMakeRange(midMatch.location + 1, (sufixMatch.location) - (midMatch.location + 1))] doubleValue]; 

    NSString *temp1 = [GPSString substringWithRange:NSMakeRange((prefixMatch.location + 1), ((midMatch.location - 0) - (prefixMatch.location + 1)))]; 
    NSString *temp2 = [GPSString substringWithRange:NSMakeRange(midMatch.location + 1, (sufixMatch.location) - (midMatch.location + 1))]; 

    NSNumber *tempLat = [NSNumber numberWithDouble:[temp1 doubleValue]]; 
    NSNumber *tempLong = [NSNumber numberWithDouble:[temp2 doubleValue]]; 

    NSLog(@"GPSString: %@", GPSString); 

    NSLog(@"latitude: %g| longitude: %g|", latitude, longitude); 
    NSLog(@"NSNumber lat: %@, NSNumberLong: %@", tempLat, tempLong); 
} 

Ergebnisse sind:

2012-03-26 10:33:10.166 GPSString: POINT(-96.795894101604 46.911266990766) 
2012-03-26 10:33:10.167 latitude: -96.7959| longitude: 46.9113| 
2012-03-26 10:33:10.168 NSNumber lat: -96.79589410160401, NSNumberLong: 46.911266990766 

warum bekomme ich einen genaueren Wert wh de den NSString/NSNumber Weg dann mit einem Double?

double latitude = [temp1 doubleValue]; 
double longitude = [temp2 doubleValue]; 

NSNumber *tempLat = [NSNumber numberWithDouble:latitude]; // Can't be more precise than latitude 
NSNumber *tempLong = [NSNumber numberWithDouble:longitude]; // Can't be more precise than longitude 

NSLog(@"latitude: %g| longitude: %g|", latitude, longitude); 
NSLog(@"NSNumber lat: %@, NSNumberLong: %@", tempLat, tempLong); 

Beachten Sie, dass in der Tat, Sie den Wert tempLat und tempLon von latitude bekommen und longitude so können sie nicht, als sie genauer sein:

+0

Ein Doppel ist nicht präzise. Verwenden Sie die Dezimalzahl, wenn Sie genaue Gleitkommawerte benötigen. Edit: sorry ich dachte das wäre C# :) Vielleicht gilt das selbe auch hier. – Silvermind

+0

Ich sehe nicht, dass Sie unterschiedliche Ergebnisse erhalten. Im ersten Fall erhalten Sie nur die standardmäßige 6.4-Formatierungspräzision. Ändern Sie die Formatierungspräzision und die Zahlen sind viel ähnlicher (wenn nicht identisch). –

Antwort

1

versuchen Sie dies.

if (latitude == [tempLat doubleValue]) { 
    NSLog(@"same"); 
} 
if (longitude == [tempLong doubleValue]) { 
    NSLog(@"same"); 
} 

Der Unterschied der String-Darstellungen bedeutet nicht den Unterschied der Werte.

2

Erstens können Sie Ihren Code in vereinfachen. Das einzige Problem besteht darin, dass Sie die Werte latitude und longitude mit dem Format %g drucken. Versuchen Sie eine andere Formatierungspräzision und Sie werden mehr Dezimalzahlen sehen:

NSLog(@"latitude: %.12f| longitude: %.12f|", latitude, longitude); 
// latitude: -96.795894101604| longitude: 46.911266990766| 
+0

Ich wusste, dass der Code vereinfacht werden könnte, ich habe nur getestet, war also nicht allzu besorgt darüber. Wenn ich% f verwende, habe ich die gleiche Genauigkeit, probierte% g und verließ es einfach. Sie haben Recht, es ist nur eine Formatierung "Fehler", wo das Objekt mehr Ziffern drucken wird, dann wird es doppelt. wie Michex darauf hingewiesen hat, sind sie im direkten Vergleich gleich. – Padin215

+0

Ich habe den Code vereinfacht, um zu zeigen, dass Sie den Wert von 'tempLat' von' latitude' erhalten. Das bedeutet, dass "Breite" keine * "weniger" * Genauigkeit haben kann. Gleiches gilt für 'longitude' und' tempLong'. – sch

+0

ah, ok, ich muss diesen Teil glasiert haben, danke. – Padin215

Verwandte Themen