Подтвердить что ты не робот

Почему NSNumberFormatter не удаляет десятичную точку и конечные нули?

Я хочу преобразовать unsigned long int в NSString, отформатированные запятыми, каждые 3 цифры и ни десятичную точку, ни конечные нули. Я могу получить запятые в NSString без каких-либо проблем с использованием NSNumberFormatter, но по какой-то причине я не могу убрать десятичную точку и нули.

Это мой код:

NSNumberFormatter *fmtr;
unsigned long int intToBeDisplayed;
intToBeDisplayed = 1234567890;
fmtr = [[[NSNumberFormatter alloc] init] autorelease];
[fmtr setUsesGroupingSeparator:YES];
[fmtr setGroupingSeparator:@","];
[fmtr setGroupingSize:3];
[fmtr setAlwaysShowsDecimalSeparator:NO];
NSLog([fmtr stringFromNumber:[NSNumber numberWithUnsignedLong:intToBeDisplayed]]);

В журнале отображается "1,234,567,890.00", соответственно добавив запятые, но, к сожалению, нежелательные ".00". Я пробовал эту конструкцию с int вместо unsigned long int, с меньшими целыми значениями и другими конструкциями из разных блогов, но безрезультатно. Я был бы очень благодарен за любые предложения о том, как получить десятичную точку и конечные нули из NSString.

Я новичок в Objective-C, став старейшиной в отношении сингулярного синдрома, пытаясь решить эту проблему, но я на том этапе, когда каждый маленький урок, полученный и достигнутый в Objective-C, является источником большой радости.

4b9b3361

Ответ 1

Вы также можете использовать setMaximumFractionDigits для усечения фракции:

unsigned long int intToBeDisplayed = 1234567890;
NSNumber *longNumber = [NSNumber numberWithUnsignedLong:intToBeDisplayed];

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setUsesGroupingSeparator:YES];
[formatter setGroupingSeparator:@","];
[formatter setGroupingSize:3];
[formatter setMaximumFractionDigits:0];

NSString *formattedNumber = [formatter stringFromNumber:longNumber];
NSLog(@"The formatted number is %@", formattedNumber);

Результат:

Отформатированное число составляет 1 234 567 890

Это работает в iOS 2.0 и более поздних версиях.

Ответ 2

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

1. NSNumberFormatter:

NSNumberFormatter *valueFormatter = [[NSNumberFormatter alloc]init];
valueFormatter.locale = [NSLocale currentLocale];    // <-- allow the device locale setting
// valueFormatter.GroupingSeparator:@","];           // don't force locale behavior
valueFormatter.numberStyle = NSNumberFormatterDecimalStyle;
valueFormatter.usesGroupingSeparator = YES;
valueFormatter.groupingSize = 3;
valueFormatter.maximumFractionDigits = 0;            // this is important to have your primary issue solved

2. показать номера с правильной локалью:

В вашем случае нет необходимости использовать NSNumberFormatter, поскольку устройство пока покажет разделитель. Чтобы построить NSString из примитивных типов данных (например, int) с правильным поведением локали, просто используйте localizedStringWithFormat и отформатируйте номер следующим образом:

NSString *testString = [NSString localizedStringWithFormat:@"%lu", intToBeDisplayed];

с объектами NSNumber:

NSNumber *longNumber = [NSNumber numberWithUnsignedLong:intToBeDisplayed];
NSString *testString = [NSString localizedStringWithFormat:@"%lu", longNumber.unsignedLongValue];

3. показать номера с помощью NSNumberFormatter (правильный язык):

NSNumber *longNumber = [NSNumber numberWithUnsignedLong:intToBeDisplayed];
NSString *testString = [NSString localizedStringWithFormat:@"%@", [valueFormatter stringForObjectValue:longNumber]];

Использование объекта NSNumber longNumber в методах или текстовых полях, например:

testLabel.text = [NSString localizedStringWithFormat:@"%@", [valueFormatter stringForObjectValue:longNumber]];

будет производить следующий вывод на устройствах с установкой английского языка:

1234567890

на устройствах с (например,) языковой настройкой языка, он автоматически отображает номер следующим образом:

1.234.567.890

Надеюсь, я мог бы добавить немного больше к проблеме (форматированию) номера.

Ответ 3

Это приведет к удалению десятичной точки и завершающих нулей.

[fmtr setPositiveFormat:@"#"]

и/или

[fmtr setNegativeFormat:@"#"]

Ответ 4

Это исправит это!

 [fmtr setGeneratesDecimalNumbers:NO];

Вывод:

2011-03-31 18:40:45.645 Stephen[41552:903] 1,234,567,890