繁体   English   中英

iOS SWIFT 4使用区域设置将字符串转换为十进制

[英]IOS SWIFT 4 convert String to Decimal with Locale

在IOS SWIFT 4中,我尝试根据给定的String for Money计算创建一个小数 ,考虑到当前语言环境 (主要考虑小数分隔符和分组分隔符)

只是尝试将Decimal初始化与Locale,BUT结合使用,如该链接中所述,如果字符串包含非数字字符,则它只会读取该字符,而不是提供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
}

我已经看到很多地方都在讨论这个问题,但是还没有一个完全解决的答案。 想知道考虑语言环境将给定String值转换为Decimal数的最佳方法是什么。 (如果德语/法语-组分隔符为“。”,十进制分隔符为“,”等)

尝试这个 :

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM