Ich entwickle eine Anwendung, in der ich verschiedene Währungsformate behandeln möchte, abhängig vom aktuellen Gebietsschema. Mit einer NSNumberFormatter
kann ich eine Zahl ohne Probleme in String und zurück übersetzen.Wie lege ich einen Währungszeichenfolgenwert auf ein UITextField fest, wobei die Codierung beibehalten wird?
Aber, wenn ich den String-Wert in eine UITextField
und später bekomme es zurück, werde ich nicht in der Lage, die Zeichenfolge zurück in eine Zahl und ich werde stattdessen einen Wert erhalten.
Hier ist ein Beispielcode das Problem zu erklären:
NSNumberFormatter *nf = [Utils currencyFormatter];
NSNumber *n = [NSNumber numberWithInt:10000];
NSString *s = [nf stringFromNumber:n];
NSLog(@"String value = %@", s);
UITextField *t = [[UITextField alloc] init];
// I put the string into the text field ...
t.text = s;
// ... and later I get the value back
s = t.text;
NSLog(@"Text field text = %@", s);
n = [nf numberFromString:s];
NSLog(@"Number value = %d", [n intValue]);
wo die currencyFormatter
Methode definiert ist auf diese Weise:
+ (NSNumberFormatter *)currencyFormatter
{
static NSNumberFormatter *currencyFormatter;
if (!currencyFormatter) {
currencyFormatter = [[NSNumberFormatter alloc] init];
[currencyFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[currencyFormatter setLocale:[NSLocale currentLocale]];
if ([currencyFormatter generatesDecimalNumbers] || [[currencyFormatter roundingIncrement] floatValue] < 1) {
[currencyFormatter setGeneratesDecimalNumbers:YES];
[currencyFormatter setRoundingIncrement:[NSNumber numberWithFloat:0.01]];
}
}
return currencyFormatter;
}
(Die innere if
verwendet zu zwingen, den Formatierer immer rund bis zur kleinsten Dezimalstelle, zB auch für CHF-Werte).
Was ich in der Konsole erhalten, ist dies:
2012-03-29 00:35:38.490 myMutuo2[45396:fb03] String value = € 10.000,00
2012-03-29 00:35:38.494 myMutuo2[45396:fb03] Text field text = € 10.000,00
2012-03-29 00:35:38.497 myMutuo2[45396:fb03] Number value = 0
Das seltsame ist, dass der Abstand Charakter zwischen €
und 1
in der ersten Zeile in der Konsole über einen mitten in der Luft Punkt dargestellt, während in In der zweiten Zeile verschwindet dieser Punkt. Ich glaube, dass dies ein Problem mit der Codierung ist.
Kann mir jemand helfen, dieses Problem zu lösen? Vielen Dank!
bearbeiten
änderte ich meinen Testcode dazu:
NSNumberFormatter *nf = [Utils currencyFormatter];
NSNumber *n = [NSNumber numberWithInt:10000];
NSString *s = [nf stringFromNumber:n];
NSLog(@"String value = %@ (space code is %d)", s, [s characterAtIndex:1]);
UITextField *t = [[UITextField alloc] init];
t.text = s;
s = t.text;
NSLog(@"Text field text = %@ (space code is %d)", s, [s characterAtIndex:1]);
n = [nf numberFromString:s];
NSLog(@"Number value = %d", [n intValue]);
dies zu entdecken:
2012-03-29 02:29:43.402 myMutuo2[45993:fb03] String value = € 10.000,00 (space code is 160)
2012-03-29 02:29:43.405 myMutuo2[45993:fb03] Text field text = € 10.000,00 (space code is 32)
2012-03-29 02:29:43.409 myMutuo2[45993:fb03] Number value = 0
Die NSNumberFormatter
schreibt den Raum als non-breaking Raum (ASCII-Zeichen 160) und dann UITextField
diesen Raum als ein einfaches Leerzeichen (ASCII-Zeichen 32) neu codiert. Eine bekannte Problemumgehung für dieses Verhalten? Vielleicht könnte ich einfach den Platz durch einen freien Platz ersetzen, aber ... wird es für alle Locales funktionieren?
es funktioniert nicht nur für Ihre Währung Gebietsschema. Ich habe es überprüft und den gleichen Nullwert bekommen, wie du gesagt hast. –
Siehe meine bearbeitete Antwort zum zweiten Mal. Dies kann dir etwas helfen. –