如何在 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?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UIkit 中添加 SwiftUI 对象

如何在 SwiftUI 中使用 SFSafariViewController?

如何在 swiftUI 视图中使用按钮? [关闭]

如何在 SwiftUI 中使用 .fileimporter 保存音频文件并检索文件并在 SwiftUI 列表中显示它们的文件名?

如何在 Xcode Playground 中使用 SwiftUI?

如何在 SwiftUI 中使用渐变填充形状