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, например.
Знаете ли вы, как я могу справиться с этим?
Ответы
Ответ 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"
как можно было бы ожидать