2012-05-31 1 views
6

Я использую NSNumberFormatter для форматирования значений float как целых строк, т. Е. Опуская дробную часть. Мне показалось странным, что цифры в диапазоне (-0.5, 0)* промежуток времени в конечном итоге как -0. Поскольку это значение будет отображаться для пользователя, я думаю, что отрицательный ноль не подходит. Я экспериментировал с различными комбинациями numberStyle и roundingMode без успеха.NSNumberFormatter округление до отрицательного нуля

Есть ли способ настроить NSNumberFormatter для вывода их как 0, или мне нужно прибегнуть к ручной коррекции для этого диапазона?

ответ

2

Я должен был исправить это сам. Я использую NSNumberFormatter для отображения температуры по умолчанию numberStyle - NSNumberFormatterNoStyle, который округляет числа до целого целого числа, roundingMode устанавливается в NSNumberFormatterRoundHalfUp. В конце концов я перехватил значения в проблемном диапазоне и сам вокруг себя:

- (NSString *)temperature:(NSNumber *)temperature 
{ 
    float f = [temperature floatValue]; 
    if (f < 0 && f > -0.5) 
     temperature = [NSNumber numberWithLong:lround(f)]; 

    return [self.temperatureFormatter stringFromNumber:temperature]; 
} 
1

Нет, у него нет возможности настроить его.

В режиме «10.4» NSNumberFormatter в основном просто обертывает CFNumberFormatter (хотя это не является прямой оплатой по мостам). Вы можете посмотреть список ключей свойств Formatterter, и довольно ясно, что ничего не будет делать то, что вы хотите. (Возможно, это возможно в режиме «10,0», для выяснения этого потребуется немного проб и ошибок. Но я сомневаюсь, что вы хотите это использовать.)

Итак, предварительное округление (как предполагает Джастин Бу), вероятно, ваш лучший вариант.

Вы могли бы, конечно, выполнить пост-процесс. То, что вы хотите сделать, вероятно, зависит от того, хотите ли вы также отображать -0.00 как 0,00, что вы хотите сделать для локализации, которые не используют «-0» и т. Д. Самый простой случай будет таким же простым, как это:

@interface NSNumberFormatter (NegativeZero) 
- (NSString *)stringFromNumberNoNegativeZero:(NSNumber *)number; 
@end 

@implementation NSNumberFormatter (NegativeZero) 
- (NSString *)stringFromNumberNoNegativeZero:(NSNumber *)number { 
    NSString *s = [self stringFromNumber:number]; 
    if ([s isEqualToString:@"-0"]) return @"0"; 
    return s; 
} 
@end 

Но если вам нужно что-то более сложное, это будет усложняться.

+0

ОК. Я пошел с перехватом значения в проблемном диапазоне и округлением его сам: 'float f = [number floatValue]; if (f < 0 && f > -0.5) number = [NSNumber numberWithLong: lround (f)]; ' – Palimondo

+1

Обратите внимание, что строковые манипуляции, как показано здесь, неправильно обрабатывают все языковые стандарты. Существуют и другие символы, используемые для '0', и потенциально также разные символы для отрицательных значений. Вам лучше округлить число в числовой форме и позволить цифрам форматировать делать свою работу. – Palimondo

+0

@Palimondo: ответ уже говорит о том, что «предварительное округление ... вероятно, является вашим лучшим вариантом», и даже если вы решите выполнить постпроцесс, «именно то, что вы хотите сделать, вероятно, зависит от того, что вы хотите сделать для локализации, которые не используют «-0», поэтому комментарий не добавляет никакой новой информации. – abarnert