如何在目标C中的每3位数字前添加逗号?


72

如果我有一个数字,int aNum = 2000000该如何格式化它,以便可以将其显示为NSString 2,000,000?

Answers:


80

不要自己格式化数字。几乎可以肯定,您不会正确处理所有边缘情况或正确处理所有可能的语言环境。使用将NSNumberFormatter数字数据格式化为本地化的字符串表示形式。

您将使用NSNumberFormatter实例方法-setGroupingSeparator:将分组分隔符设置为@","(或更好[[NSLocale currentLocale] objectForKey:NSLocaleGroupingSeparator];感谢@ntesler),并-setGroupingSize:每3位放置一个分组分隔符。


太酷了,我在-setGroupingSize:之后都设置好了吗?还是我需要-setFormat :?
RexOnRoids

10
更好地本地化[formatter setGroupingSeparator: [[NSLocale currentLocale] objectForKey:NSLocaleGroupingSeparator]];
Nathan

NSNumberformatter不够好,尤其是如果您需要准备使用国际格式时。
brainray

NSNumberFormatter对NSDecimalNumber的处理不够好。它会失去精度。
Big Money

如果我想用点(。)而不是逗号(,)可能是合适的解决方案?
伯茹

149

使用NSNumberFormatter

特别:

NSNumberFormatter *formatter = [NSNumberFormatter new];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle]; // this line is important!

NSString *formatted = [formatter stringFromNumber:[NSNumber numberWithInteger:2000000]];

[formatter release];

默认情况下NSNumberFormatter使用当前语言环境,因此默认情况下将分组分隔符设置为其正确的值。关键是要记住设置数字样式。


是的,即使我已将语言环境设置为English UK,也将其设置为NSNumberFormatterDecimalStyle,即使在将语言环境设置为English UK时,它也不会解析“ 200,000”。认为它只会理解字符串“ 200000”
brian.clear

2
@MCKapur为什么您说新学校是旧学校?输入更多内容以执行相同操作没有意义,不是吗?
朱利奥·拜伦

1
@JulioBailon WOW这就像两年前一样。老实说,我不记得为什么我说+ new是旧学校。不是。但是,我确实更喜欢+ alloc-init来保持一致性,+ new总是觉得这是不必要的捷径,并且+ alloc-init帮助我保持了良好的代码习惯。
MCKapur

如果我既要逗号又要小数位怎么办?
GeneCode

34

有一个静态方法NSNumberFormatter可以满足您的需求:

int aNum = 2000000;
NSString *display = [NSNumberFormatter localizedStringFromNumber:@(aNum)
                                                     numberStyle:NSNumberFormatterDecimalStyle];

NSNumberFormatter如果您不需要对格式化程序进行任何其他配置,则与创建新方法相比,这种方法更为简洁。


18

更简单:

NSNumber *someNumber = @(1234567890);
NSString *modelNumberString = [NSString localizedStringWithFormat:@"%@", someNumber];
NSLog(@"Number with commas: %@", modelNumberString);

同事今天才教我这个 #惊人


1
localizedStringWithFormat取决于您当前的语言环境,并且针对不同的语言会产生不同的分隔符。
Aliaksandr Bialiauski '16

16

想一些,因为我会在这篇文章中寻找样本。因此,如果您正在处理数字,请注意下一个参数:

setNumberStyle:NSNumberFormatterCurrencyStyle // if you are working with currency

也可能是

setNumberStyle:NSNumberFormatterDecimalStyle

所有代码均为ARC。

如果您正在使用Integer,并且需要获得例如200,000的结果

int value = 200000;
NSNumberFormatter * formatter = [NSNumberFormatter new];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
NSString * newString =  [formatter stringFromNumber:[NSNumber numberWithInteger:value]];

如果您正在使用Float,并且需要获取诸如200,000.00之类的结果

float value = 200000;
NSNumberFormatter * formatter = [NSNumberFormatter new];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setMaximumFractionDigits:2]; // Set this if you need 2 digits
NSString * newString =  [formatter stringFromNumber:[NSNumber numberWithFloat:value]];

编辑

为了能够使用不同的数字分隔符而使用NSLocale。将代码添加到NSLocale在区域设置标识符上指定的位置:

[formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"de_DE"]];

或使用当前的本地:

[formatter setLocale:[NSLocale currentLocale]];

如果我要点(。)而不是逗号(,),那么?
伯茹

1
我们使用的简单方法NSLocale只是添加[formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"de_DE"]];以使用不同的分隔符,取决于本地数字样式
Nazir

如何显示5,234.00 ...我需要显示2个十进制数字
Yalamandarao

@新加坡setMaximumFractionDigits用来设置您需要的数字
Nazir

1

迅捷版

let formatter = NSNumberFormatter()
formatter.numberStyle = .DecimalStyle
formatter.maximumFractionDigits = decimalPlaces
let result = formatter.stringFromNumber(NSNumber(double: 8.0))

通过http://ios.eezytutorials.com


0

一个简单的解决方案可能是这样。我的答案几乎与@Nazir的答案相同,但有一个小技巧。

double current_balance = 2000000.00;

NSNumberFormatter * formatter = [NSNumberFormatter new];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
//[formatter setNumberStyle:NSNumberFormatterCurrencyStyle];  //if you want for currency with $ sign
[formatter setMinimumFractionDigits:2]; // Set this if you need 2 digits
[formatter setMaximumFractionDigits:2]; // Set this if you need 2 digits
NSString * currency_format =  [NSString stringWithFormat:@"%@", [formatter stringFromNumber:[NSNumber numberWithDouble:current_balance]]];

0

对于Swift 4.0

let formatter = NumberFormatter()

formatter.numberStyle = .decimal

formatter.minimumFractionDigits = 2

formatter.maximumFractionDigits = 2

let result = formatter.string(from: NSNumber(value: 123456))

0

对于那些需要使用数字字符串而不仅仅是整数(即大数字)的人,我做了以下宏:

#define addCommas(__string) (\
(^NSString *(void){\
NSString *__numberString = __string;\
NSString *__integerPortion = __numberString;\
NSString *__decimalPortion = @"";\
if ([__string containsString:@"."]) {\
__integerPortion = [__numberString componentsSeparatedByString:@"."][0];\
__decimalPortion = st(@".%@", [__numberString componentsSeparatedByString:@"."][1]);\
}\
int __i = (int)__integerPortion.length-3;\
while (__i > 0) {\
__integerPortion = st(@"%@,%@", substringInRange(__integerPortion, 0, __i), substringInRange(__integerPortion, __i, (int)__integerPortion.length));\
__i -= 3;\
}\
__numberString = st(@"%@%@", __integerPortion, __decimalPortion);\
return __numberString;\
})()\
)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.