我正在开发一个应用程序,根据当前的语言环境,我希望在其中处理不同的货币格式。使用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)。对于这种行为,有什么已知的解决方法吗?也许我可以用一个不间断的空间来代替这个空间,但是。。。它适用于所有地区吗?
一个可能的解决方法:您可以尝试通过正则表达式模式仅解析数字值(和标点符号),并根据该数字创建货币值。如果你这样做,用户可能会更容易被原谅,如果他键入了另一个货币符号或其他不应该出现的符号。。。
我只能通过自定义类扩展UITextField
来解决这个问题。在这个新类中,我放置了一个类型为NSString
的新@property
,在其中存储文本字段的"计算"字符串值。此字符串将永远不会被修改,并将保留文本字段内容的原始编码。
当您需要再次处理文本字段的原始未经修改的内容时,您必须引用此新属性,而不是引用text
属性。
使用单独的字符串容器是避免这些奇怪的编码更改的唯一方法。