2012-01-13 82 views
1

我有一個類似的問題在這個問題:How to obtain an unformatted string representation of an NSDecimal or NSDecimalNumber?我需要一個字符串格式的數字準確地表示爲一個NSNumber,但這個數字被轉換回其他字符串地方,我無法避免。我遇到的問題是,當數字轉換回字符串時,在某些情況下,字符串採用科學記數法。防止科學記數法與NSDecimalNumber輸出作爲NSString

NSDecimalNumber *dn = [NSDecimalNumber decimalNumberWithString:@"0.0001"]; 
NSString *s = [dn stringValue]; // s will be @"1E-4" 

如何防止以科學計數法顯示此號碼?

我在GNUstep的大約2005版本(可能是GNUstep Base的v1.11.1)中工作,而不是在mac或iPhone上,這可能解釋了行爲與我引用的其他問題的一些差異。我已經瀏覽了我的GNUstep安裝中的base library API和文檔,但我似乎無法找到任何幫助。

編輯12年2月7日:

的問題已經略有改變,但我們的目標仍然是相同的。最初,我不認爲我能夠控制字符串輸出塊,但我可以將值作爲字符串傳回。在這一點上,我試圖使用格式化字符串,但我仍然想阻止出現科學記數法。

[NSString stringWithFormat:@"%1.14g", [val doubleValue]] 

我選擇使用%g,因爲我們想爲價值顯著數字的具體數量。如果我使用%f,我可以修剪額外的零,但是數字並不總是很清晰。例如,800000000.79顯示爲800000000.7899999600。

有沒有辦法讓一個完全格式化數量多達一定數量的顯著位數(或小數)沒有這一數字位數之前顯示科學記數法?

我也願意接受C的建議。

回答

0

嘗試使用NSNumberFormatter而不是stringValue方法打印數字。它有更多的選擇。

(我假設NSNumberFormatter可以用在GNUstep)

2

你應該看看NSNumberFormatter

// Create formatter 
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];  
[formatter setNumberStyle:NSNumberFormatterDecimalStyle]; // adjust this 
NSString *formattedOutput = [formatter stringFromNumber:yourDecimalNumber]; 
+0

它看起來就像我們使用(1.11.1也許無論GNUstep的版本?),NSNumberFormatter類沒有完全實現。這個文檔包含這個消息:「這個類目前沒有在GNUstep中實現!所有的set方法都可以工作,但stringForObject:會完全忽略這個格式。下面的文檔描述了這個行爲應該是什麼......」 – 2012-01-23 15:42:09

1

如何獲得C值(雙,INT,長等),然後將其格式化爲C字符串,或作爲NSStringstringWithFormat:

0

使用下面的方法避免科學指數符號表示法。

double轉換成字符串

func getStringFrom(double doubleVal: Double) -> String 
{ 
    var stringValue : String = "0.00" 

    let formatter = NSNumberFormatter() 
    formatter.usesSignificantDigits = true; 
    formatter.maximumSignificantDigits = 100 
    formatter.groupingSeparator = ""; 
    formatter.numberStyle = .DecimalStyle 
    stringValue = formatter.stringFromNumber(doubleVal)!; 

    return stringValue 

}

字符串轉換爲Double

func getDoubleFrom(textField textField: UITextField) -> Double 
{ 
    var doubleValue : Double = 0.0 

    if let val = textField.text 
    { 
     let numberFormatter = NSNumberFormatter() 
     numberFormatter.numberStyle = NSNumberFormatterStyle.DecimalStyle 
     let finalNumber = numberFormatter.numberFromString(val) 
     doubleValue = (finalNumber?.doubleValue)!; 
    } 

    return doubleValue 
}