Почему NSNumberFormatter не удаляет десятичную точку и конечные нули? - PullRequest
13 голосов
/ 01 апреля 2011

Я хочу преобразовать 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 , с меньшими целочисленными значениями и другими конструкциями из различных блогов, но все безрезультатно. Буду очень признателен за любые предложения о том, как получить десятичную точку и конечные нули из строки NSS.

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

Ответы [ 4 ]

31 голосов
/ 06 июля 2011

Вы также можете использовать 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 и более поздних версиях.

5 голосов
/ 26 марта 2015

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

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 в метках или текстовых полях, например ::1010*

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

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

1.234.567.890

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

1.234.567.890

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

0 голосов
/ 31 октября 2013

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

[fmtr setPositiveFormat:@"#"]

и / или

[fmtr setNegativeFormat:@"#"]
0 голосов
/ 01 апреля 2011

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

 [fmtr setGeneratesDecimalNumbers:NO];

Выход:

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