2012-06-10 41 views
4

如果我做的Objective-C如下:防止小負數印刷爲「-0」

NSString *result = [NSString stringWithFormat:@"%1.1f", -0.01]; 

它會給結果@"-0.0"

有誰知道我怎麼能強迫的結果@"0.0"(沒有「 - 」)在這種情況下?

編輯: 我試過使用NSNumberFormatter,但它有相同的問題。下面還生產@"-0.0"

double value = -0.01; 
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init]; 
[numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
[numberFormatter setMaximumFractionDigits:1]; 
[numberFormatter setMinimumFractionDigits:1]; 
NSString *result = [numberFormatter stringFromNumber:[NSNumber numberWithDouble:value]]; 

回答

5

我想要一個通用的解決方案,與數字格式器的配置無關。

我已經使用了一個類別來將功能添加到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.0fNSString *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。

+0

優秀的答案 – fishinear

+0

感謝@fishinear,比從來沒有更晚的遲到,我希望:-) – Benjohn

0
NSString *result = [NSString stringWithFormat:@"%1.1f", -0.01*-1]; 

如果不是一個價值傳遞的情況下,你可以檢查:

float myFloat = -0.01; 
NSString *result = [NSString stringWithFormat:@"%1.1f", (myFloat<0? myFloat*-1:myFloat)]; 

編輯: 如果你只想0.0爲正值:

NSString *result = [NSString stringWithFormat:@"%1.1f",(int)(myFloat*10)<0?myFloat:myFloat*-1]; 
+0

感謝您的回答,但我只希望導致零打印而沒有減號的值。例如,-0.1仍然應該導致@「 - 0.1」。 – fishinear

+0

感謝您的編輯。這種方法當然會起作用,但依賴於stringWithFormat:方法的內部結構的精確工作方式以及我正在使用的格式字符串。例如,您當前的方法對值-0.05產生不正確的「0.1」。我希望避免對內部進行那種微調。 – fishinear

+0

你是個好人。正如@sulthan所說,'NSNumberFormatter'是你的解決方案 – user1447414

1

使用NSNumberFormatter。通常,不應使用NSString格式將數據呈現給用戶。

編輯: 正如問題所述,這不是正確的答案。有很多解決方案。檢查負零點很容易,因爲它定義爲等於任何零(0.0f == -0.0f),但實際問題是其他許多值可以四捨五入至負零。我建議後處理 - 而不是捕捉這些值,它將檢查結果是否只包含零數字(跳過其他字符)。如果是,請刪除前導減號。

+0

呃,實際上這不是在這種情況下向用戶展示。但除此之外,NSNumberFormatter似乎有相同的問題(請參閱編輯)。你知道在NSNumberFormatter上設置什麼參數來防止這種情況嗎? – fishinear

+0

糟糕。我希望格式化程序可以檢查至少這(我已經使用我自己的格式化程序的NSDecimalNumbers)。看我的編輯。 – Sulthan

+0

所以我想沒有簡單的答案。我會接受你的回答,因爲後處理至少避免瞭解操作的確切內部。 – fishinear

0

通過採用float或double值將數字轉換爲NSString。 將字符串轉換回NSNumber。

NSDecimalNumber *num = [NSDecimalNumber decimalNumberWithString:@"-0.00000000008"]; 
    NSString *st2 = [NSString stringWithFormat:@"%0.2f", [num floatValue]]; 
    NSDecimalNumber *result = [NSDecimalNumber decimalNumberWithString:st2]; //returns 0 
+0

floatValue也會捨去十進制數。 – ArunGJ