我如何使用 NumberFormatter 的扩展将 String 转换为 Float

How could i convert with an extension of NumberFormatter a String to a Float

我创建了 NumberFormatter 和 binaryInteger 的扩展,以将 Int 转换为 String,其中 space 介于数千之间,如下所示: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) ?? ""
    }
}

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

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

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

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

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

试试这个:

extension String {
    func backToFloat() -> Float {
      // Make a copy of original string
      var temp = self

      // Remove spaces
      temp.removeAll(where: { [=10=] == " " })

      return Float(temp) ?? 0.0
    }
}

print("1 234 567.2".backToFloat())
// log: 1234567.2

要启用 Float -> StringDouble -> String:

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

print(12345678.12.formattedWithSeparator)
// log: 12 345 678.12