簡體   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