在 Swift 中将字符串转换为 Double 尊重 NSLocale

Ger*_*tan 2 localization number-formatting 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)")
            }

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

测试结果:

测试结果

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

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

如何进行从 String 到 Double 的转换,以便

doubleValue == toDouble(nf.stringFromNumber(doubleValue))
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*n R 5

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

if let d = Double(str) {
Run Code Online (Sandbox Code Playgroud)

经过

if let d = nf.numberFromString(str) {
Run Code Online (Sandbox Code Playgroud)