如何将NumberFormatter扩展名的字符串转换为Float

问题描述

我创建了NumberFormatter和binaryInteger的扩展,以将Int转换为String,其中千位之间的间隔如下:11111-> 11111 现在,在另一个地方,我需要将特定字符串的转换反向为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: $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
        }
    }
}
,

尝试一下:

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

      // Remove spaces
      temp.removeAll(where: { $0 == " " })

      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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...