Я хотел получить общее решение, независимо от конфигурации форматирования чисел.
Я использовал категорию, чтобы добавить функциональность в NSNumberFormater;
@interface NSNumberFormatter (PreventNegativeZero)
- (NSString *)stringFromNumberWithoutNegativeZero:(NSNumber *)number;
@end
С внедрением:
@implementation NSNumberFormatter (PreventNegativeZero)
- (NSString *)stringFromNumberWithoutNegativeZero:(NSNumber *)number
{
NSString *const string = [self stringFromNumber: number];
NSString *const negZeroString = [self stringFromNumber: [NSNumber numberWithFloat: -0.0f]];
if([string isEqualToString: negZeroString])
{
NSString *const posZeroString = [self stringFromNumber: [NSNumber numberWithFloat: 0.0]];
return posZeroString;
}
return string;
}
@end
Как это работает
Ключевой особенностью это спросить номер форматировщик, как он будет отформатирован -0.0f
(т.е. с плавающей точкой минус ноль) NSString
, чтобы мы могли обнаружить это и принять меры по исправлению положения.
Зачем это делать? В зависимости от конфигурации форматировочной, -0.0f
может быть отформатирован как: @"-0"
, @"-0.0"
, @"-000"
, @"-0ºC"
, @"£-0.00"
, @"----0.0"
, @"(0.0)"
, @".⓪零"
действительно, довольно много ничего. Итак, мы спросить форматере, как это будет формат -0.0f
с помощью строки: NSString *const negZeroString = [self stringFromNumber: [NSNumber numberWithFloat: -0.0f]];
вооружившись нежелательному -0.0f
строки, когда произвольное число входных отформатирован, он может быть проверен, чтобы увидеть, если она соответствует нежелательным -0.0f
строка.
Вторая важная особенность заключается в том, что число форматера также запрашивается для замены положительной нулевой строки. Это необходимо для того, чтобы по-прежнему соблюдалось его форматирование. Это делается с помощью строки: [self stringFromNumber: [NSNumber numberWithFloat: 0.0]]
Оптимизация, которая не работает
Заманчиво выполнить численный тест самостоятельно для будет ли введенный номер будет отформатирован как -0.0f
строки, но это крайне нетривиальным (т. е. вообще невозможно вообще). Это связано с тем, что набор чисел, который будет отформатирован до строки -0.0f
, зависит от конфигурации форматирования. Если округление округляется до ближайшего миллиона, то -5,000f
в качестве ввода будет отформатирован как строка -0.0f
.
ошибка реализации, чтобы избежать
Когда вход, который форматирует к -0.0f
строке обнаруживаются, положительная нулевая эквивалентная выходная строка генерируется с использованием [self stringFromNumber: [NSNumber numberWithFloat: 0.0]]
. Обратите внимание, что, в частности:
- Код форматирует поплавок буквального
0.0f
и возвращает его.
- Код не использовать отрицание ввода.
Отрицание ввода -0.1f
приведет к форматированию 0.1f
. В зависимости от поведения форматирования это можно округлить и привести к @"1,000"
, который вам не нужен.
Final Примечание
Для чего это стоит, подход/шаблон/алгоритм, используемый здесь будет переводить на другие языки и разные строки форматирования API.
Отличный ответ – fishinear
Спасибо @fishinear, лучше поздно, чем никогда, надеюсь :-) – Benjohn