将String转换为NSDecimalNumber

Hon*_*Tom 10 string nsdecimalnumber ios swift

我尝试将String转换为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
}
Run Code Online (Sandbox Code Playgroud)

首先,我认为可能是错误的,但即便如此.它不起作用.第一次打印(转换前)显示例如80,00,但打印(decimalReturn)仅显示80

if行只是检查结果是否不是数字.

rob*_*off 17

使用an NSNumberFormatter来解析输入.将其generatesDecimalNumbers属性设置为true:

let formatter = NumberFormatter()
formatter.generatesDecimalNumbers = true
Run Code Online (Sandbox Code Playgroud)

如果你想在无法解析字符串时返回0,这就是你如何使用它:

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

decimal(with: "80.00")

// Result: 80 as an NSDecimalNumber
Run Code Online (Sandbox Code Playgroud)

默认情况下,格式化程序将查看设备的区域设置以确定小数点标记.你应该这样离开.为了举例,我将强制它到法语区域:

// 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
Run Code Online (Sandbox Code Playgroud)

如果您确实希望始终使用逗号作为小数点,则可以设置decimalSeparator属性:

formatter.decimalSeparator = ","
Run Code Online (Sandbox Code Playgroud)

  • 我读过 NSDecimal 是精确的计算,但如果我取 80.01,结果是 80.01000002 如果我取 80.10 它是 80.09999999。你如何将数字减少到2? (2认同)