swift - 我如何使用 NumberFormatter 的扩展将字符串转换为浮点数
问题描述
我创建了 NumberFormatter 和 binaryInteger 的扩展,将 Int 转换为 String ,其中千位之间有一个空格,例如 thise: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: $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
}
}
}
推荐阅读
- python - 当我们序列化数据时,Django Rest Framework 是否以二进制格式存储数据,如果是,那么我们如何从序列化中排除特定字段?
- amazon-web-services - 复制现有 Cognito 用户池的最佳方法是什么
- c# - Microsoft.Azure.CognitiveServices.Language.SpellCheck NuGet 不使用必应搜索 API(未经授权)
- c# - 为什么基于策略的授权中没有 OR 逻辑?
- python - PyQt6删除带有嵌套类的自定义小部件导致程序崩溃
- c++ - 除了使用 new 关键字之外,下面显示的代码没有给出编译时错误
- web-scraping - 在 > < 汤之间检索
- css - 如何在角度动画状态下修改 CSS 变量
- amazon-web-services - DynamoDB 查询性能低
- cypress - 运行功能文件时缺少以下步骤实现:XXX-XXXXXX-XXXXX