从NSNumberformater numberFromString获取nil

时间:2012-07-10 10:24:16

标签: objective-c nsnumberformatter

我正在尝试将来自es_US语言环境(x,xxx.xx)的.txt文件中的数据格式化为我当前的语言环境,其格式为es_ES(x.xxx,xx)。我希望[NSNumberFormater numberFromString]只重新格式化字符串,但是我只从这个方法得到一个零值。

在从这里检查答案之后我也尝试了另一种方法,但是如果字符串有千位分隔符,则NSDecimalnumber不起作用,所以如果有人能告诉我我做错了什么,请...

 - (void) setSaldo_sap:(NSString *)saldo_sap
 {
    NSNumberFormatter *numFormatter = [[NSNumberFormatter alloc] init];

    [numFormatter setLocale:[NSLocale currentLocale]];
    [numFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
    [numFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
    [numFormatter setNegativeFormat:@"-¤#,##0.00"];

    //saldo_sap = @"         -324,234.55"
    NSString * tmpString = [saldo_sap stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

    NSNumber *num = [numFormatter numberFromString:tmpString];
    NSDecimalNumber *tempNumber = [NSDecimalNumber decimalNumberWithString:tmpString];  

    _saldo_sap = [numFormatter stringFromNumber:tempNumber];        
}

2 个答案:

答案 0 :(得分:1)

我认为你误解了NSNumberFormatter的目标:它没有“重新格式化”,它“格式化”和“解析”按照设定规则格式化的数字。因此,如果您有“es_US”语言环境中的数字但想要使用“es_ES”格式化它们,则需要两个NSNumberFormatters:每个语言环境一个。

使用“es_US”解析传入的数字并使用“es_ES”格式化,简化了一点(我不知道这两个语言环境以及数字的确切格式,因此您可能需要稍微调整一下):

NSString * tmpString = ...

NSNumberFormatter *usFormatter = [[NSNumberFormatter alloc] init];
[usFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier: @"es_US"] autorelease]];
[usFormatter setHasThousandSeparators: YES];

NSNumberFormatter *esFormatter = [[NSNumberFormatter alloc] init];
[esFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier: @"es_ES"] autorelease]];
[esFormatter setHasThousandSeparators: YES];

// this assignment looks also somewhat weird: is it an instance variable? 
// 'cause if it is and you assign an autoreleased string you'll have a bad pointer there
_saldo_sap = [esFormatter stringFromNumber: [usFormatter numberFromString: tmpString]];

// And unless you use ARC you leak your formatter on each call, so at the end
[usFormatter release];
[esFormatter release];

修改 如果输入字符串包含前缀/后缀字符,这可能会阻止NSNumberFormatter工作(它通常使用非常严格),请使用setLenient:

“设置接收方是否会使用启发式方法来猜测字符串所需的数字。”

如果您要转换多个号码,请不要为每个号码创建格式化程序,这只会浪费内存和CPU。使它们成为实例变量并重用。它将比仅仅有一个格式化程序并在解析一种格式和另一种格式化之间重新配置它更清晰。

答案 1 :(得分:-1)

NSString *_saldo_sap = @"         -324234.55";
//NSString *_saldo_sap = @"         324,234.55";

NSString * tmpString = [_saldo_sap stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
//tmpString = @"-324,234.55"

NSNumberFormatter *numFormatter = [[NSNumberFormatter alloc] init];
NSNumber *num = [numFormatter numberFromString:tmpString];

[numFormatter setLocale:[NSLocale currentLocale]];
[numFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[numFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[numFormatter setNegativeFormat:@"-¤#,##0.00"];

_saldo_sap = [numFormatter stringFromNumber:num];

首先,为了从NSString获取NSNumber,字符串必须是正确的可读格式,即它必须不包括任何字符,如所述的“,”。 其次,您必须先将字符串转换为NSNumber,然后相应地格式化它。