NSDecimalFormatter和货币符号:$ US而不是$

时间:2011-10-26 22:55:12

标签: objective-c ios nsdecimalnumber

我必须错过一些明显的东西,但由于我在这方面浪费了太多时间,我会让专家看一看。我只是愿意得到一个符合我想要的格式的字符串,但是货币符号给了我一个问题:当我只想要符号时,它正在使用某种国际代码。

NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setCurrencyCode:currencyCode];
[formatter setPositiveFormat:@"#,##0.00 ¤"];
[formatter setNegativeFormat:@"-#,##0.00 ¤"];

这导致: $ US 1,250.56而不是 $ 1,250.56

我不会设置区域设置,因为我只有一个符号:EUR / USD / GBP等。

3 个答案:

答案 0 :(得分:5)

如果您想要一个美元符号和一个美元符号,为什么不只是指定'$#,##0.00'这样的格式$?或者,指定一个区域设置,默认情况下将按照您希望的方式格式化数量。

指定NSNumberFormatterCurrencyStyle只是设置区域设置的标准货币格式的快捷方式,其中包括符号是以数字为前缀还是后缀,但与您正在做的事情关系不大,因为正在手动指定格式。

您看到US$因为它正在为您所在的地区格式化货币USD。 (虽然你必须混淆你的格式字符串和输出,因为确实尊重你是否请求货币代码的前缀或后缀。)但是darvids0n大多是正确的:

  • 格式字符串中的一个货币符号会放置该货币的区域设置符号,其中en为“$”,许多其他货币为US$;
  • 两个国际符号,如“USD”;
  • 三个地方显示该货币的显示名称,例如“美元”。

以下是使用瑞典语语言环境的此行为示例(默认情况下继承,未明确设置;这就是我的机器现在设置的内容):

> nf := NSNumberFormatter alloc init
> nf setNumberStyle:NSNumberFormatterDecimalStyle
> amt := 1250.56

> nf setPositiveFormat:'¤ #,##0.00'
> nf stringFromNumber:amt
'US$ 1 250,56'

> nf setPositiveFormat:'#,##0.00 ¤'
> nf stringFromNumber:amt
'1 250,56 US$'

> nf setPositiveFormat:'#,##0.00 ¤¤'
> nf stringFromNumber:amt
'1 250,56 USD'

> nf setPositiveFormat:'#,##0.00 ¤¤¤'
> nf stringFromNumber:amt
'1 250,56 US-dollar'

(语法是F-Script的语法。)

答案 1 :(得分:1)

尝试NSNumberFormatterCurrencyStyle。

这个简单的代码:

NSNumberFormatter *currencyFormatter = [[[NSNumberFormatter alloc] init] autorelease];
[currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[currencyFormatter setCurrencyCode:currencyCode];

NSString *formatted = [currencyFormatter stringFromNumber:[NSDecimalNumber decimalNumberWithString:@"1250.56"]];
NSLog(@"%@", formatted);

输出:

2011-10-26 19:18:49.141 Craplet[8716:707] $1,250.56

那就是说,我无法重复你的问题。如果我使用十进制样式,您的正面和负面显式格式化工作:

// ...
[currencyFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
// ...
[currencyFormatter setPositiveFormat:@"#,##0.00 ¤"];
[currencyFormatter setNegativeFormat:@"-#,##0.00 ¤"];

2011-10-26 19:29:28.943 Craplet[9458:707] 1,250.56 $
2011-10-26 19:29:28.949 Craplet[9458:707] -1,250.56 $

答案 2 :(得分:-1)

对于货币,数字样式应设置为NSNumberFormatterCurrencyStyle

编辑:根据@Jeremy W. Sherman的更正,您看到的$US是某些(全部?)非美元的currencySymbol en区域设置,默认情况下应显示在CurrencyStyle中。美元的internationalCurrencySymbolUSD,如果您按照Unicode tr35-10的格式提供两个货币字符,则只应显示国际货币符号。

我认为你只需要解析货币字符串并删除字母字符。当然,假设没有货币符号只是大写字母。