如何在 SwiftUI 中使用 NumberFormatter?
Posted
技术标签:
【中文标题】如何在 SwiftUI 中使用 NumberFormatter?【英文标题】:How to use a NumberFormatter in SwiftUI? 【发布时间】:2021-04-16 17:29:42 【问题描述】:我正在尝试使用下面的NumberFormatter
,但不知道如何在Text
视图中使用它?网上的一切都与TextView
有关。
static let numberFormat: NumberFormatter =
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .none
numberFormatter.positivePrefix = "+"
numberFormatter.negativePrefix = "-"
return numberFormatter
()
我尝试使用:但我收到错误Instance method 'appendInterpolation(_:formatter:)' requires that 'Int' inherit from 'NSObject'
Text("\(450, formatter: Self.numberFormat)")
【问题讨论】:
您查看过NumberFormatter
文档吗?有很多关于如何使用它的细节。
@GarySabo:我的答案已更新,请查看新的更新。谢谢
【参考方案1】:
需要告知 Swift 将 Int 转换为格式化程序的 NSNumber。
Text("\(450 as NSNumber, formatter: Self.numberFormat)")
无需对您的代码进行其他更改。
【讨论】:
【参考方案2】:这是一个简单的方法:
通过这种方式,您可以让@State
尽可能干净。此外,formatterFunction(number: Int)
现在可以重复使用,并且与您的方式相比,可以从任何地方访问,而您的方式将无法重复使用或访问。
extension Formatter
static let number: NumberFormatter =
let formatter = NumberFormatter()
formatter.numberStyle = .none
formatter.positivePrefix = "+"
formatter.negativePrefix = "-"
return formatter
()
func formatterFunction(number: Int) -> String
Formatter.number.string(for: number) ?? ""
struct ContentView: View
@State var number: Int = 450
var body: some View
Text(formatterFunction(number: number))
如果您只想在文本中添加 + 和 -,那么只需使用下面的这个函数:
func formatterFunction(number: Int) -> String
if number > 0
return "+" + String(number)
else if number < 0
return "-" + String(abs(number))
else
return String(number)
【讨论】:
无需从您的整数创建NSNumber
对象。您可以改用Formatter
的方法string(for: Any)
。顺便说一句,返回“魔术”字符串是 IMO 的坏习惯。只需将返回类型更改为可选并返回nil
或简单地强制解包结果,如果它永远不会失败。请注意,每次调用此函数时都会创建一个新的 NumberFormatter。 Apple 不鼓励直接访问 description
属性。只需使用 String 初始化程序。
developer.apple.com/documentation/swift/customstringconvertible/…
@swiftPunk 只返回一个空字符串
@swiftPunk 这不是一个好主意,因为您可能会根据您使用格式化程序的方式创建一个赛车条件
最好有两个格式化程序并且永远不要更改其属性以上是关于如何在 SwiftUI 中使用 NumberFormatter?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SwiftUI 中使用 SFSafariViewController?
如何在 SwiftUI 中使用 .fileimporter 保存音频文件并检索文件并在 SwiftUI 列表中显示它们的文件名?