首页 > 解决方案 > 我如何使用 NumberFormatter 的扩展将字符串转换为浮点数

问题描述

我创建了 NumberFormatter 和 binaryInteger 的扩展,将 Int 转换为 String ,其中千位之间有一个空格,例如 thise:11111 -> 11 111 现在,在另一个地方,我需要将特定字符串的转换反转为 Float ,就像这样: 11 111 -> 11111。

这是 NumberFormatter 和 BinaryInteger 的第一个扩展:

extension Formatter {
    static let withSeparator: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.groupingSeparator = " "
        formatter.allowsFloats = true
        formatter.numberStyle = .decimal
        return formatter
    }()
}

extension BinaryInteger {
    var formattedWithSeparator: String {
        return Formatter.withSeparator.string(for: self) ?? ""
    }
}

那么,我如何编写另一个扩展程序来进行相反的过程呢?谢谢你。

标签: swiftstringintegerconvertersseparator

解决方案


您可以使用相同withSeparator的格式化程序,并将另一个扩展名添加到BinaryInteger

extension BinaryInteger {
    init?(fromStringWithSeparator string: String) {
        if let num = NumberFormatter.withSeparator.number(from: string)
            .map({ Self.init(truncatingIfNeeded: $0.int64Value) }) {
            self = num
        } else {
            return nil
        }
    }
}

在这里,我基本上将数字解析为NSNumber,然后将其转换为Int64,然后将其转换为所需的任何类型BinaryInteger。这不适用于UInt64超出范围的值Int64,因为第一次转换会将它们转换为负数。所以如果你也想处理这些数字,你应该写另一个UInt64扩展:

extension UInt64 {
    init?(fromStringWithSeparator string: String) {
        if let num = NumberFormatter.withSeparator.number(from: string)?.uint64Value {
            self = num
        } else {
            return nil
        }
    }
}

推荐阅读