我想要一个通用的解决方案,与数字格式器的配置无关。
我已经使用了一个类别来将功能添加到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"
。
最后请注意
对于它的价值,这里使用的方法/模式/算法将翻译成其他语言和不同的字符串格式化的API。
优秀的答案 – fishinear
感谢@fishinear,比从来没有更晚的迟到,我希望:-) – Benjohn