1

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

从这里检查答案后,我还尝试了另一种方法,但是如果字符串有千位分隔符,则 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];        
}
4

2 回答 2

1

我认为您误解了 NSNumberFormatter 的目的:它不会“重新格式化”,而是“格式化”和“解析”按照设定规则格式化的数字。因此,如果您有来自“es_US”语言环境的数字,但想使用“es_ES”对其进行格式化,您将需要两个 NSNumberFormatter:每个语言环境一个。

使用“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。使它们成为实例变量并重用。这将比仅拥有一个格式化程序并在解析一种格式和格式化另一种格式之间重新配置它要清晰得多。

于 2012-07-10T11:47:23.130 回答
-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,然后对其进行相应的格式化。

于 2012-07-10T12:14:41.413 回答