【问题标题】:Swift iOS - Convert currency formatted string to numberSwift iOS - 将货币格式的字符串转换为数字
【发布时间】:2017-06-30 10:05:13
【问题描述】:

我已使用 NumberFormatter 类将数字转换为货币格式的字符串(例如 2000 -> £2,000.00)。但是我需要一种将格式化字符串转换回数字的方法(例如 £2,000.00 -> 2000)。

事实证明,简单地通过格式化程序运行它是行不通的,只会产生 nil。有谁知道实现这一目标的最佳方法?

【问题讨论】:

  • 我相信有一些本地化框架可以为您做到这一点。

标签: ios swift currency numberformatter


【解决方案1】:

Swift 4:以下字符串扩展有助于将货币格式的字符串转换为十进制或双精度。该方法会自动识别大多数常见货币的数字格式。

字符串必须没有货币符号(€、$、£、...):

例如:

美国格式字符串:“11.233.39” -> 11233.39

欧洲格式化字符串:“11.233,39” -> 11233.39

// String+DecimalOrDouble

extension String {   
    func toDecimalWithAutoLocale() -> Decimal? {
        let formatter = NumberFormatter()
        formatter.numberStyle = .decimal

        //** US,CAD,GBP formatted
        formatter.locale = Locale(identifier: "en_US")

        if let number = formatter.number(from: self) {
            return number.decimalValue
        }
        
        //** EUR formatted
        formatter.locale = Locale(identifier: "de_DE")

        if let number = formatter.number(from: self) {
           return number.decimalValue
        }
        
        return nil
    }
    
    func toDoubleWithAutoLocale() -> Double? {
        guard let decimal = self.toDecimalWithAutoLocale() else {
            return nil
        }

        return NSDecimalNumber(decimal:decimal).doubleValue
    }
}

在 Playground 中测试的示例:

import Foundation

//US formatted without decimal mark
str = "11233.3"
decimal = str.toDecimalWithAutoLocale() //11233.3
double = str.toDoubleWithAutoLocale() //11233.3

//EU formatted without decimal mark
str = "11233,3"
decimal = str.toDecimalWithAutoLocale() //11233.3
double = str.toDoubleWithAutoLocale() //11233.3

//US formatted with decimal mark
str = "11,233.3"
decimal = str.toDecimalWithAutoLocale() //11233.3
double = str.toDoubleWithAutoLocale() //11233.3

//EU formatted with decimal mark
str = "11.233,3"
decimal = str.toDecimalWithAutoLocale() //11233.3
double = str.toDoubleWithAutoLocale() //11233.3

【讨论】:

    【解决方案2】:

    快速技巧:

    let numString = String(number.characters.filter { "0123456789.".characters.contains($0) })           
    let number = Double(numString)
    

    【讨论】:

    • 这不好。没有处理明显的问题,即不同的价格写法(即“。”与“,”)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-30
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多