Frage

Meine app verwenden monetären Wert, und ich mochte diese Werte in der Währung darstellen und Formate, die der Benutzer auf dem iPhone jedoch festgelegt hat, bei der Prüfung, scheine ich Probleme mit dem deutschen EURO-Format zu haben.

Ich habe ein Verfahren, welches Returns eine Dezimalzahl (für in Kern Speichern von Daten) von der Währung formatierten String. Die Saite wurde tatsächlich durch ein anderes (ähnliches) Verfahren unter Verwendung von NSlocale formatiert.

Ich habe mit Großbritannien, USA, Japan und Deutschland Gegenden getestet, bisher nur Deutschland Probleme verursacht hat.

Hier ist der Code, der String übergeben wird, ist zum Beispiel: 2,56 €

+ (NSDecimalNumber*)TLCurrencyFormatFromString:(NSString*)strNumber {


NSNumberFormatter *fmtrCurrencyFromStr = nil;

fmtrCurrencyFromStr = [[NSNumberFormatter alloc] init];
[fmtrCurrencyFromStr setFormatterBehavior:NSNumberFormatterBehavior10_4];
[fmtrCurrencyFromStr setLocale:[NSLocale currentLocale]];
[fmtrCurrencyFromStr setNumberStyle:NSNumberFormatterCurrencyStyle];
[fmtrCurrencyFromStr setGeneratesDecimalNumbers:YES];


NSLog(@"Currency Separator: %@", [fmtrCurrencyFromStr decimalSeparator]); //prints a comma
NSLog(@"Currency Code: %@", [fmtrCurrencyFromStr currencyCode]); //prints EUR

int currencyScale = [fmtrCurrencyFromStr maximumFractionDigits];

NSDecimalNumberHandler *roundingBehavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain scale:currencyScale raiseOnExactness:FALSE raiseOnOverflow:TRUE raiseOnUnderflow:TRUE raiseOnDivideByZero:TRUE]; 

NSDecimalNumber* currencyNumber = [[NSDecimalNumber alloc] initWithDecimal:[[fmtrCurrencyFromStr numberFromString:strNumber] decimalValue]];

NSLog(@"Currency Number = %@", [currencyNumber decimalNumberByRoundingAccordingToBehavior:roundingBehavior]);

return [currencyNumber decimalNumberByRoundingAccordingToBehavior:roundingBehavior];

}

Die 'currencyNumber' Variable wird gedruckt als: -18446912453607470532000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

, während in allen anderen Orten, ist es 2,56 zum Speichern in Core Data als NSDecimalNumber drucken.

War es hilfreich?

Lösung

Zur Einstellung der Eigenschaft:

[fmtrCurrencyFromStr setLenient:YES];

behebt das Problem für Frankreich, Deutschland, Norwegen, Großbritannien, USA, Japan, Nambia etc ... Ich kann nicht sagen, dass es für alle behebt, weil ich nicht alles getestet haben, aber von allen, die ich habe bisher getestet, hat es funktioniert.

Andere Tipps

I denkt Ihr Problem ist mit der Zeile

NSDecimalNumber* currencyNumber = [[NSDecimalNumber alloc] initWithDecimal:[[fmtrCurrencyFromStr numberFromString:strNumber] decimalValue]];

Versuchen Sie es mit der meist-Äquivalent Linie ersetzt

NSDecimalNumber * currencyNumber = [fmtrCurrencyFromStr numberFromString:strNumber];

Sie haben Satz generatesDecimalNumbers, so dass die beiden so ziemlich gleichwertig sind mit Ausnahme eines ärgerlichen Fall. Nil

eine Nachricht an nil Senden garantiert 0 für die meisten Standard-Typen (integer (mit Ausnahme nicht 64-Bit-Integer auf alte 32-Bit-Runtimes), Gleitkomma, Zeigertypen) nichts und Rückkehr zu tun; es „gibt“ nicht initialisierten Speicher, wenn die Methode eine Struktur zurückgibt. NSDecimal ist eine Struktur.

(Der eigentliche Grund ist im Wesentlichen, dass die Laufzeit nicht weiß, wie groß die Struktur ist, weiß also nicht, wie viel Speicher auf Null, damit Sie „nicht initialisierte“ get Speicher statt. Ich traf in der Regel diese ein, wenn ich tun v.frame ohne dass v Gewährleistung ist nicht gleich Null.)

EDIT: Natürlich können Sie andere Problem ist, warum NSNumberFormatter ist den Preis nicht richtig Parsen. Das ist eine schwierige Frage. Ich würde versuchen, das Währungssymbol Strippen.

ich festgestellt, dass auf iOS 4.3 mit der [Formatierer setLenient: JA] Flagge für mich gearbeitet und Euro mit. Ohne diesen Flag gesetzt ist, beinhaltet die Forma nicht korrekte Werte für Euro zurück.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top