swift - NumberFormatter 的 generatesDecimalNumbers 不起作用

标签 swift numbers decimal

我的函数是将字符串转换为十进制数

func getDecimalFromString(_ strValue: String) -> NSDecimalNumber {
    let formatter = NumberFormatter()
    formatter.maximumFractionDigits = 1
    formatter.generatesDecimalNumbers = true
    return formatter.number(from: strValue) as? NSDecimalNumber ?? 0
}

但它没有按预期工作。有时它像这样返回

Optional(8.300000000000001)
Optional(8.199999999999999)

而不是 8.3 或 8.2。在字符串中,我有像“8.3”或“8.2”这样的值,但转换后的十进制不符合我的要求。有什么建议我犯错了吗?

最佳答案

generatesDecimalNumbers 设置为 true 并不像预期的那样工作。返回值是 NSDecimalNumber 的一个实例(可以准确表示值 8.3),但显然格式化程序首先将字符串转换为二进制 float (并且不能正好代表 8.3)。因此返回的十进制值只是近似正确。

这也被报告为一个错误:

另请注意(与文档相反),maximumFractionDigits 属性在解析 字符串时无效 变成一个数字。

有一个简单的解决方案:使用

NSDecimalNumber(string: strValue) // or
NSDecimalNumber(string: strValue, locale: Locale.current)

相反,取决于字符串是否已本地化。

或者使用 Swift 3 Decimal 类型:

Decimal(string: strValue) // or
Decimal(string: strValue, locale: .current)

例子:

if let d = Decimal(string: "8.2") {
    print(d) // 8.2
}

关于swift - NumberFormatter 的 generatesDecimalNumbers 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43538661/

相关文章:

list - 如何在Python中将月份数字转换为月份名称

java - Java十进制转二进制方法

python - 如何将十六进制数转换为存储在 DWORD 而不是 QWORD 中的十进制数?

ios - 从 FBSDKGraphRequest 到 Storyboard

ios - 使用 swiftvalidator 时,类 'AppDelegate' 的重复接口(interface)定义错误和属性有先前的声明错误

r - 在 Venneuler R 包中显示计数

javascript - float : Breakpoint when increasing by 1 does nothing

ios - 如何从 UITableView 单元格获取数据到全局变量

swift - 使用 [String : Int] in Swift 类型的简写] 返回字典

java - 在 Java 中打印时将 double 字格式化为 2 位小数