Почему 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, является источником большой радости.
Ответы
Ответ 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