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