【发布时间】:2019-03-03 20:42:31
【问题描述】:
在 IOS SWIFT 4 中,我试图从给定的 String 中为 Decimal 创建一个 Decimal strong>Money 计算考虑当前 Locale(主要考虑 Decimal Separator & GroupingSeparator)
刚刚尝试将 十进制初始化 与区域设置一起使用,但如 this link 中所述,如果字符串包含非数字字符,它只会读取该字符而不是提供 nil。所以我不知道字符串是否已成功转换为 Decimal 或部分考虑。例如,在以下情况下,如果数字字符串(stringValue)具有分组分隔符,它只会读取到该字符(即逗号)。所以以下代码提供的答案为 1。
let stringValue: String = "1,200.00"
let decValue: Decimal = Decimal(string: stringValue, locale: Locale(identifier: "en_GB")) // ANSWER - 1
这就是十进制初始化的问题。我可以使用 NumberFormatter 解决分组分隔符问题,如下所示,但转换后的 NSNumber 中的 decimalValue 属性提供了错误的值。
let stringValue: String = "8.20"
let nf = NumberFormatter()
nf.locale = Locale(identifier: "en_GB")
nf.usesGroupingSeparator = true
nf.numberStyle = NumberFormatter.Style.decimal
if let number = nf.number(from: stringValue)
{
let decValue: Decimal = number.decimalValue // ANSWER: 8.199999999999999
}
我已经看到很多地方都讨论过这个问题,但还没有看到完全解决的答案。想听听考虑到语言环境,将给定的字符串值转换为十进制数的最佳方法是什么。 (如果德语/法语 - 组分隔符是“.”,小数分隔符是“,”等)
【问题讨论】:
-
二进制文件中没有
8.2 -
@Carpsen90
Decimal使用十进制。 -
@Carpsen90,这就是为什么尝试使用 Decimal 来处理这些情况。例如十进制(字符串:“8.20”)! ....我想考虑分组分隔符以及我的问题中的解释。
-
@JibW openradar.me/29923468 你最好的办法是使用
String的初始化器Decimal。我建议在解析之前使用正则表达式验证你的字符串,这应该是你所需要的。