我想要一個通用的解決方案,與數字格式器的配置無關。
我已經使用了一個類別來將功能添加到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