Problem mit NSString -doubleValue

B

BenWishh

Aktives Mitglied
Thread Starter
Dabei seit
15.07.2008
Beiträge
904
Reaktionspunkte
87
Hallo zusammen,

ich habe folgendes Problem: Ich lese aus einer Textdatei kommagetrennte Werte aus und speichere diese als Strings in ein Array. Jetzt möchte ich die Strings von bestimmten Feldern in doubles umwandeln und damit Rechnen. Leider liefert mir die NSString Funktion doubleValue() einen komplett anderen Wert zurück. Liegt es daran, dass mein String die Nachkommastellen mit einem "." trennt?

Als kleines Beispiel zum nachvollziehen:
Code:
NSString *test = @"5121.2354";
double wert = [test doubleValue];
NSLog(@"%d", wert);

Dann wirft mir das Programm als Double-Wert "1126999418" aus.

Was mache ich falsch, ich stehe auf dem Schlauch ;)

Danke schonmal im Voraus
 
Hallo,

das %d ist falsch. Es muss %f lauten.
Ausserdem solltest Du CGFloat bevorzugt nehmen.

Viele Grüße
 
  • Gefällt mir
Reaktionen: BenWishh
Ich bin ein Depp und sage Danke!
 
Hallo,

das %d ist falsch. Es muss %f lauten.
Ausserdem solltest Du CGFloat bevorzugt nehmen.

Viele Grüße
Der Ratschlag ist so allgemein und auch hier gefährlich.

CGFloat ist ein von Apple eingeführter Datentyp, der kein C-Datentyp ist. Es handelt sich entweder um einen Float oder einen Double.
Code:
#if defined(__LP64__) && __LP64__
typedef double CGFloat;
…
#else	/* !defined(__LP64__) || !__LP64__ */
typedef float CGFloat;
…
#endif	/* !defined(__LP64__) || !__LP64__ */

Die Formatstrings kennen überhaupt keinen Specifier dafür, sondern man muss sich entweder des %f oder des %g verwenden, die beide einen Double spezifizieren.
CGFloat
%f or %g
%f works for floats and doubles when formatting; but see below warning when scanning

Wegen einer Eigenart von C beim Aufruf, ist es aber möglich, %f bei einem Float zu verwenden, weshalb das bei CGFloat immer funktioniert, also unabhängig davon, ob es sich um einen Float oder einen Double handelt. Das hängt aber mit den Aufrufkonventionen zusammen.

Bei einem Scan geht das schon in die Hose, weil dort ein Pointer auf einen Float oder einen Double übergeben wird.
In addition to the considerations mentioned in Table 2, there is one extra case with scanning: you must distinguish the types for float and double. You should use %f for float, %lf for double. If you need to use scanf (or a variant thereof) with CGFloat, switch to double instead, and copy the double to CGFloat.
Code:
CGFloat imageWidth;
double tmp;
sscanf (str, "%lf", &tmp);
imageWidth = tmp;
It is important to remember that %lf does not represent CGFloat correctly on either 32- or 64-bit platforms. This is unlike %ld, which works for long in all cases.
 
  • Gefällt mir
Reaktionen: nonsense, little_pixel und below
Zurück
Oben Unten