NSNumberFormatter с разделителем с запятой - программирование
Подтвердить что ты не робот

NSNumberFormatter с разделителем с запятой

Я попытался преобразовать NSString как "12000.54" в "12.000,54". Я написал экземпляр NSNumberFormatter.

NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
[formatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setGroupingSeparator:@"."];
[formatter setDecimalSeparator:@","];

Но когда я NSLog это:

NSLog(@"%@",[formatter stringFromNumber:[formatter numberFromString:value]]);

Он печатает нулевое значение. Если я изменю свою запятую, если она работает правильно. Я просто хотел бы разместить то, что я хочу для своего поля разделителей (запятая, точка, косая черта и т.д.), И у меня есть разные выходы: 12/000,54 12,000.54 12,000,54, например.

Знаете ли вы, как я могу справиться с этим?

4b9b3361

Ответ 1

Итак, вопрос верен: я сам отвечаю:)

У меня есть десятичное значение, считанное из sqlite (например, 12000 или 12000.54), непосредственно преобразованное в NSString. Я должен использовать другой разделитель в какой-то момент в моем коде.

NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
[formatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setGroupingSeparator:@""];
[formatter setDecimalSeparator:@"."];

// Decimal values read from any db are always written with no grouping separator and a comma for decimal.

NSNumber *numberFromString = [formatter numberFromString:@"12000.54"]];

[formatter setGroupingSeparator:@" "]; // Whatever you want here
[formatter setDecimalSeparator:@","]; // Whatever you want here

NSString *finalValue = [formatter stringFromNumber:numberFromString];

NSLog(@"%@",finalValue); // Print 12 000,54

Проблема решена.

Ответ 2

Я бы рекомендовал не жестко кодировать разделитель, чтобы обеспечить правильное поведение разделителя, основанное на настройке локали iPhone. Самый простой способ сделать это:

с помощью objective-c

NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc]init];
numberFormatter.locale = [NSLocale currentLocale];// this ensures the right separator behavior
numberFormatter.numberStyle = NSNumberFormatterDecimalStyle;
numberFormatter.usesGroupingSeparator = YES;

// example for writing the number object into a label
cell.finalValueLabel.text = [NSString StringWithFormat:@"%@", [numberFormatter stringForObjectValue:numberFromString]]; // your var name is not well chosen

с использованием SWIFT 3

 let formatter = NumberFormatter()
 formatter.locale = NSLocale.current // this ensures the right separator behavior
 formatter.numberStyle = NumberFormatter.Style.decimal
 formatter.usesGroupingSeparator = true

 // example for writing the number object into a label
 // your variable "numberFromString" needs to be a NSNumber object
 finalValueLabel.text = formatter.string(from: numberFromString)! // your var name is not well chosen

и я бы не использовал var-name "numberFromString", потому что это метод NSNumberFormatter. Удачи!

Ответ 3

Самое простое решение, которое я недавно нашел:

NSString *localizedString = [NSString localizedStringWithFormat:@"%@", @1234567];

Также работает с ints:

NSString *localizedString = [NSString localizedStringWithFormat:@"%d", 1234567];

Проверено на игровой площадке Xcode 6. Но docs говорят, что эта функция всегда существовала.

Ответ 4

NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
numberFormatter.usesGroupingSeparator = YES;
[numberFormatter setMaximumFractionDigits:2];
[numberFormatter setMinimumFractionDigits:2];
NSString *formattedNumberString = [numberFormatter stringFromNumber:@122344.00];`

Это будет исправлять проблему округления, если вы имеете дело с десятичными точками.

Ответ 5

Для использования валюты...

let numberFormatter = NumberFormatter()

// Produces symbol (i.e. "$ " for en_US_POSIX) and decimal formatting
numberFormatter.numberStyle = .currency

// Produces commas; i.e. "1,234"
numberFormatter.usesGroupingSeparator = true
numberFormatter.groupingSize = 3

Пример использования:

let value: Double = 12345.6789
numberFormatter.string(from: value as NSNumber)

дает...

"$ 12,345.68"

как можно было бы ожидать