问题描述
我创建了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 -> String
和Double -> String
:
extension FloatingPoint {
var formattedWithSeparator: String {
return Formatter.withSeparator.string(for: self) ?? ""
}
}
print(12345678.12.formattedWithSeparator)
// log: 12 345 678.12