在 Swift 中根据 NSLocale 将 String 转换为 Double

Converting String to Double respecting NSLocale in Swift

我在屏幕上的 UITextField 中将双精度数字显示为字符串。编辑后我将其转换回 Double。

这是一个省略了 UITextField 的单元测试方法:

func testFoundationDouble() {
    let locales: [NSLocale] = [NSLocale(localeIdentifier: "en_US"), NSLocale(localeIdentifier: "de_DE")]
    let numbers: [Double] = [0.0000001, 0.1, 1, 100000000]

    for locale in locales {
        let nf = NSNumberFormatter()
        nf.locale = locale
        nf.maximumSignificantDigits = 5
        nf.minimumSignificantDigits = 1
        for number in numbers {
            if let str = nf.stringFromNumber(number) {
                if let d = Double(str) {
                    XCTAssertEqual(number, d , "numberst must be equal. original: \(number), String: \(str) converted: \(d), locale: \(locale.localeIdentifier)")
                } else {
                    XCTFail("cant interpret \(str) as Double,  locale: \(locale.localeIdentifier)")
                }
            } else {
                XCTFail("cant format \(number) with locale \(locale.localeIdentifier)")
            }

        }
    }
}

测试结果:

本质上,NSNumberFormatter 可以很好地将给定语言环境的 Double 转换为 String。

将此字符串转换回 Double 失败,因为 Double(str) 需要 en_US 语言环境中的字符串。

如何将 String 转换为 Double,以便

doubleValue == toDouble(nf.stringFromNumber(doubleValue))

对于任何给定的语言环境?

要根据语言环境将字符串转换为数字,只需 再次使用数字格式化程序,即 replace

if let d = Double(str) {

来自

if let d = nf.numberFromString(str) {