Как добавить запятые для номера каждые 3 цифры в Objective C?

Если у меня есть номер int aNum = 2000000, как мне его форматировать, чтобы отобразить его как NSString 2 000 000?

Ответ 1

Не делайте собственного форматирования чисел. Вы почти наверняка не получите все случаи краев правильно или правильно обрабатываете все возможные локали. Используйте NSNumberFormatter для форматирования числовых данных в локализованное строковое представление.

Вы использовали бы метод экземпляра NSNumberFormatter -setGroupingSeparator:, чтобы установить разделитель группировки в @"," (или еще лучше [[NSLocale currentLocale] objectForKey:NSLocaleGroupingSeparator]; thanks @ntesler) и -setGroupingSize:, чтобы поместить разделитель группировки каждые 3 цифры.

Ответ 2

Используйте NSNumberFormatter.

В частности:

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

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

[formatter release];

По умолчанию NSNumberFormatter использует текущий язык, поэтому по умолчанию разделители группировки устанавливаются в их правильные значения. Главное - запомнить стиль номера.

Ответ 3

Здесь статический метод на NSNumberFormatter, который делает именно то, что вам нужно:

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

Этот способ немного более краткий, чем создание нового NSNumberFormatter, если вам не нужно делать какую-либо дополнительную конфигурацию форматирования.

Ответ 4

Еще проще:

NSNumber *someNumber = @(1234567890);
NSString *modelNumberString = [NSString localizedStringWithFormat:@"%@", someNumber];
NSLog(@"Number with commas: %@", modelNumberString);
Сотрудник

просто научил меня этому сегодня. #amazing

Ответ 5

Подумайте, как я получу это сообщение, ища образец. Поэтому, если вы работаете с номером, обратите внимание на следующие параметры:

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

Ответ 6

Быстрая версия

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

http://ios.eezytutorials.com

Ответ 7

Простым решением может быть это. Мой ответ почти такой же, как @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]]];