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

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

52147 次浏览

不要自己设置数字格式。您几乎肯定无法正确处理所有边界情况或正确处理所有可能的区域设置。使用 NSNumberFormatter将数值数据格式化为本地化的字符串表示形式。

您可以使用 NSNumberFormatter实例方法 -setGroupingSeparator:将分组分隔符设置为 @","(或者更好的设置是 [[NSLocale currentLocale] objectForKey:NSLocaleGroupingSeparator]; 多谢@ntesler) ,使用 -setGroupingSize:将分组分隔符设置为每3位数字一个。

使用 NSNumberFormatter

具体来说:

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


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


[formatter release];

默认情况下,NSNumberFormatter使用当前区域设置,因此默认情况下将分组分隔符设置为它们的正确值。关键是要记住设置一个数字样式。

有一个 NSNumberFormatter上的静态方法正是你所需要的:

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

如果您不需要对格式化程序进行任何额外的配置,那么这种方法比创建一个新的 NSNumberFormatter要简洁一些。

想一些,因为我会得到这个帖子寻找样品。 因此,如果你正在处理数字,请注意下一个参数:

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]];

甚至更简单:

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

同事今天刚教我的

快速版

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

作者: http://ios.eezytutorials.com

一个简单的解决办法可能是这样的,我的答案几乎与@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]]];

为了 Swift 4.0

let formatter = NumberFormatter()


formatter.numberStyle = .decimal


formatter.minimumFractionDigits = 2


formatter.maximumFractionDigits = 2


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

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

#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;\
})()\
)