NSNumberFormatter numberFromString返回null

Hac*_*ord 3 iphone objective-c nsnumber nsnumberformatter ios

这是我的代码

NSNumberFormatter *currencyStyle = [[NSNumberFormatter alloc] init];

    [currencyStyle setFormatterBehavior:NSNumberFormatterBehavior10_4];
    [currencyStyle setNumberStyle:NSNumberFormatterCurrencyStyle];

    NSNumber *amount = [[NSNumber alloc] init];

    NSLog(@"the price string is %@", price);

    amount = [currencyStyle numberFromString:price];

    NSLog(@"The converted number is %@",[currencyStyle numberFromString:price]);
    NSLog(@"The NSNumber is %@", amount);

    NSLog(@"The formatted version is %@", [currencyStyle stringFromNumber:amount]);

    NSLog(@"--------------------");
    self.priceLabel.text = [currencyStyle stringFromNumber:amount]; 

    [amount release];
    [currencyStyle release];
Run Code Online (Sandbox Code Playgroud)

这是日志吐出的内容

价格字符串是5转换后的数字是(null)NSNumber是(null)格式化的版本是(null)

我错过了什么吗?

编辑:更新的代码

NSNumberFormatter *currencyStyle = [[NSNumberFormatter alloc] init];
    [currencyStyle setFormatterBehavior:NSNumberFormatterBehavior10_4];
    [currencyStyle setNumberStyle:NSNumberFormatterCurrencyStyle];

    NSNumber *amount = [currencyStyle numberFromString:price];

    NSLog(@"the price string is %@", price);
    NSLog(@"The converted number is %@",[currencyStyle numberFromString:price]);
    NSLog(@"The NSNumber is %@", amount);
    NSLog(@"The formatted version is %@", [currencyStyle stringFromNumber:amount]);
    NSLog(@"--------------------");

    self.priceLabel.text = [NSString stringWithFormat:@" %@ ", [currencyStyle stringFromNumber:amount]]; 

    [currencyStyle release];
Run Code Online (Sandbox Code Playgroud)

Rob*_*ier 6

什么是price?假设它是一个ivar,不要直接访问ivars.始终使用除dealloc和和之外的访问器init.

假设price是一个字符串,为什么这样做:

[NSString stringWithFormat:@"%@", price]
Run Code Online (Sandbox Code Playgroud)

如果priceNSNumber,那么你可以直接使用它.

你在NSNumber这里创建一个,分配给它amount,然后立即扔掉它.然后你过度释放amount.所以你应该期望上面的代码崩溃.(由于NSNumber对象的管理方式很奇怪,下次NSNumber为整数5 创建时会发生此崩溃.)

并且一直到你的实际问题,原因nil是因为"5"不是当前的货币格式,所以数字格式化程序拒绝它.如果你在美国并设置price为"$ 5.00"那么它会起作用.


如果你真的想把一个字符串转换成美元,那么这就是怎么做的.请注意,语言环境很重要.如果您使用默认语言环境,那么在法国"1.25"将为1.25欧元,这与1.25美元不同.

NSDecimalNumber保持冷静时,你应该永远是我们.否则,您将受到二进制/十进制舍入错误的影响.

以下使用ARC.

NSString *amountString = @"5.25";
NSDecimalNumber *amountNumber = [NSDecimalNumber decimalNumberWithString:amountString];
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];

NSNumberFormatter *currencyStyle = [[NSNumberFormatter alloc] init];    
[currencyStyle setNumberStyle:NSNumberFormatterCurrencyStyle];
[currencyStyle setLocale:locale];
NSString *currency = [currencyStyle stringFromNumber:amountNumber];

NSLog(@"%@", currency);
Run Code Online (Sandbox Code Playgroud)

iOS 5编程推动限制的RNMoney第13章的示例代码中提供了更完整的用于管理本地化货币()的类.