2015-11-13 66 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

有可能出现是你的代码中的另一个问题。我发布的代码在操场上工作正常。 –