【发布时间】:2012-03-28 22:40:51
【问题描述】:
我正在开发一个应用程序,我希望根据当前的语言环境处理不同的货币格式。使用 NSNumberFormatter 我可以正确地将数字转换为字符串并返回而不会出现问题。
但是,如果我将字符串值放入 UITextField 并稍后将其取回,我将无法将字符串转换回数字,而是会得到 nil 值。
下面是解释问题的示例代码:
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]);
currencyFormatter 方法是这样定义的:
+ (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;
}
(内部 if 用于强制格式化程序始终舍入到最小的十进制数字,例如,即使是 CHF 值)。
我在控制台中得到的是这样的:
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
奇怪的是,第一行中€ 和1 之间的空格字符在控制台中通过一个半空中的点表示,而在第二行中这个点消失了。我相信这是一个与编码相关的问题。
谁能帮我解决这个问题? 谢谢!
编辑
我把我的测试代码改成这样:
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]);
发现这个:
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
NSNumberFormatter 将空格写为不间断空格(ASCII 字符 160),然后UITextField 将该空格重新编码为简单空格(ASCII 字符 32)。这种行为的任何已知解决方法?也许我可以用非破坏空间替换空间但是......它适用于所有语言环境吗?
【问题讨论】:
-
它仅适用于您的货币区域设置。我检查了它并获得了与您所说的相同的空值。
-
第二次查看我的编辑答案。这可能会对您有所帮助。
标签: ios uitextfield nsnumberformatter