Swift 我如何使用NumberFormatter的扩展名将字符串转换为Float

Swift 我如何使用NumberFormatter的扩展名将字符串转换为Float,swift,string,integer,converters,separator,Swift,String,Integer,Converters,Separator,我创建了NumberFormatter和binaryInteger的一个扩展,将Int转换为数千之间的字符串,如下所示:11111->11111 现在,在另一个地方,我需要反转从特定字符串到浮点的转换,如:11111->11111 以下是NumberFormatter和BinaryInteger的第一个扩展: extension Formatter { static let withSeparator: NumberFormatter = { let formatter

我创建了NumberFormatter和binaryInteger的一个扩展,将Int转换为数千之间的字符串,如下所示:11111->11111 现在,在另一个地方,我需要反转从特定字符串到浮点的转换,如:11111->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) ?? ""
    }
}
那么,我如何编写另一个扩展来进行反向过程呢?
谢谢。

您可以将相同的
与separator
格式化程序一起使用,并将另一个扩展添加到
二进制Integer

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
范围之外的
UInt64
值,因为第一次转换会将它们转换为负数。因此,如果您还想处理这些数字,您应该编写另一个
UInt64
扩展名:

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

扩展字符串{
func backToFloat()->Float{
//复制原始字符串
var temp=自
//删除空格
临时removeAll(其中:{$0==“”})
回流浮子(温度)??0.0
}
}
打印(“1234567.2”.backToFloat())
//日志:1234567.2
要启用
Float->String
Double->String

扩展浮点{
var formattedWithSeparator:String{
返回格式化程序.withSeparator.string(用于:self)?“”“
}
}
打印(12345678.12.使用分隔符格式化)
//日志:12345 678.12

非常感谢。它可以工作:)请Eric,你能告诉我我的初始代码是int-to-string还是float-to-string,或者两者都可以工作吗?格式化程序既可以工作,也可以工作于double-to-string。您只需为
FloatingPoint
protocal实现
formattedWithSeparator
。我编辑了我的答案,加入了一个例子。