2015-11-13 153 views
5

我嘗試將字符串轉換爲NSDecimalNumber這裏我的代碼:字符串轉換爲NSDecimalNumber

class func stringToDecimal (dataToDecimal: String) -> NSDecimalNumber { 

    let dataToDecimal = dataToDecimal.stringByReplacingOccurrencesOfString(",", withString: ".") 
    print(dataToDecimal) 
    let decimalReturn = NSDecimalNumber(string: dataToDecimal) 
    print(decimalReturn) 

    if decimalReturn == NSDecimalNumber.notANumber(){ 
     return 0.00 
    } 
    return decimalReturn 
} 

首先,我認爲也許是錯誤的,但即使有。它不起作用。 第一次打印(轉換前)顯示例如80,00,但打印(decimalReturn)僅顯示80

if行僅用於檢查結果是否不是數字。

+0

你試過80.01嗎? –

回答

11

使用NSNumberFormatter解析您的輸入。其generatesDecimalNumbers屬性設置爲true:

let formatter = NumberFormatter() 
formatter.generatesDecimalNumbers = true 

這裏是你如何使用它,如果你想返回0時,字符串不能被解析:

func decimal(with string: String) -> NSDecimalNumber { 
    return formatter.number(from: string) as? NSDecimalNumber ?? 0 
} 

decimal(with: "80.00") 

// Result: 80 as an NSDecimalNumber 

默認情況下,格式化會看設備的區域設置來確定小數點標記。你應該這樣離開它。例如起見,我將它強制法文場所:

// DON'T DO THIS. Just an example of behavior in a French locale. 
formatter.locale = Locale(identifier: "fr-FR") 

decimal(with: "80,00") 
// Result: 80 

decimal(with: "80.00") 
// Result: 0 

如果你真的想始終使用逗號作爲小數點標記,可以設置decimalSeparator屬性:

formatter.decimalSeparator = "," 
+0

它的工作,但我不得不這樣做了'讓dataToDecimal = dataToDecimal.stringByReplacingOccurrencesOfString(「‘withString:’。」)'首先,把我的字符串得到不爲零。如果我只是嘗試一個帶有「,」的字符串,它會導致結果爲零。 – HongKongTom

+0

我讀過NSDecimal是精確的計算,但如果我採取80.01結果是80.01000002,如果我採取80.10它是80.09999999。你如何將數字減少到2? – HongKongTom

+0

你必須顯示你的代碼。作爲一個新問題最好這樣做。 –

1

您從String創建NSDecimalNumber的方式沒有任何問題。但是,如果您的本地格式數字如此,您可能無需擔心用句點替換逗號。

它打印80而不是80,00或80.00的原因是print只是使用數字的description屬性。如果你想自定義格式,你應該設置你自己的NSNumberFormatter

let number = NSDecimalNumber(string: "80.00") 
print(number) // 80 
let formatter = NSNumberFormatter() 
formatter.minimumFractionDigits = 2 
let string = formatter.stringFromNumber(number) 
print(string) // 80.0 
+0

我嘗試了,但在實際的項目和場地帶來的錯誤消息「無法將類型的值‘串’到期望的參數類型‘的NSNumber’但是...... minimumFractions我喜歡並會與玩。 – HongKongTom

+0

有可能出現是你的代碼中的另一個問題。我發佈的代碼在操場上工作正常。 –