如何将货币字符串值设置为UITextField,保留编码?

时间:2012-03-28 22:40:52

标签: ios uitextfield nsnumberformatter

我正在开发一个应用程序,我希望处理不同的货币格式,具体取决于当前的区域设置。使用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 char 160)写下来,然后UITextField将该空格重新编码为一个简单空格(ASCII char 32)。这种行为的任何已知解决方法?也许我可以用一个不间断的空间来替换空间,但......它会适用于所有的语言环境吗?

2 个答案:

答案 0 :(得分:0)

可能的解决方法:您可以尝试通过正则表达式模式仅解析数值(和点击),并根据该数字创建货币值。如果你以这种方式这样做,如果他输入另一个货币符号或其他不应该存在的符号,那么用户可能更可原谅...

答案 1 :(得分:0)

我只能通过自定义类扩展UITextField来解决此问题。在这个新类中,我添加了一个@property类型NSString,其中我存储了文本字段的“计算”字符串值。永远不会修改此字符串,并保留文本字段内容的原始编码。

当您需要再次处理文本字段的原始未触动内容时,您必须引用此新属性,而不是引用text属性。

使用单独的字符串容器是避免这些奇怪编码更改的唯一方法。