IOS SWIFT 4 使用区域设置将字符串转换为十进制
Posted
技术标签:
【中文标题】IOS SWIFT 4 使用区域设置将字符串转换为十进制【英文标题】:IOS SWIFT 4 convert String to Decimal with Locale 【发布时间】: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
。我建议在解析之前使用正则表达式验证你的字符串,这应该是你所需要的。
可能相关:generatesDecimalNumbers for NumberFormatter does not work.
【参考方案1】:
试试这个:
let stringValue: String = "8.20"
let loc = Locale(identifier: "en_GB")
let nf = NumberFormatter()
nf.locale = loc
nf.usesGroupingSeparator = true
nf.numberStyle = .decimal
var decValue: Decimal? = nil
if let _ = nf.number(from: stringValue)
var copy = stringValue
if let sep = loc.groupingSeparator
copy = copy.split(separator: Character(sep)).joined()
decValue = Decimal(string: copy, locale: loc)
你可以这样检查结果:
decValue.map print($0) //8.2
【讨论】:
嗨 Carpsen90,感谢您的回答,这将处理分组分隔符.....但问题是我不知道十进制初始化是否考虑了我的完整字符串或者它已经考虑了在它收到无效的十进制字符串的情况下,它的一部分。例如 Decimal(string: "12.45d2") ---> 回答 12.45,而不是在这些情况下获得 NIL…….. 还有什么需要考虑的等是一个问题。需要确定这一点,因为这会进行金钱计算。以上是关于IOS SWIFT 4 使用区域设置将字符串转换为十进制的主要内容,如果未能解决你的问题,请参考以下文章