SwiftUI TextField 货币格式问题

Rud*_*den 3 formatting usability currency textfield swiftui

我在使用 TextField 输入货币金额时遇到了 SwiftUI 最终用户的可用性问题。

绑定字段是双精度型,初始设置为 0,当显示文本字段时,提示为 $0.00。

问题是,当用户想要输入一个值时,他们必须手动使用退格键删除 0.00。另外,如果他们不小心在 $ 符号上退格,则此后输入的任何值都会消失!

当存在多个货币字段时,这对于最终用户来说是一个真正的麻烦。

formatter.zeroSymbol = ""我在互联网上看到了在 NumberFormatter 中设置 的建议,但是当numberStyle = .currency输入的任何值都会丢失/损坏。

如果我将数字样式更改为.decimal,我可以使用该zeroSymbol选项并且它似乎有效,但我丢失了货币格式。

有谁知道如何解决这一问题?

以下是您可以运行来演示此问题的示例代码。


import SwiftUI

struct ContentView: View {
    @State private var amount: Double = 0
    
    let currencyFormat: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.numberStyle = .currency
        //                formatter.zeroSymbol = ""
        return formatter
    }()

    var body: some View {
        HStack {
            Text("Enter Amount")
            Spacer()
            TextField("", value: $amount, formatter: currencyFormat)
                .keyboardType(.numbersAndPunctuation)
        }
        .padding()
        
    }
}
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

Run Code Online (Sandbox Code Playgroud)

小智 5

详细阐述@Zulqarnain Naveed 的答案:

TextField("",value: $amount, format: .currency(code: Locale.current.currency?.identifier ?? "USD"))
Run Code Online (Sandbox Code Playgroud)

添加以下代码行。当聚焦时,这将选择文本字段中的所有文本:

.onReceive(NotificationCenter.default.publisher(for: UITextField.textDidBeginEditingNotification)) { obj in
                    if let textField = obj.object as? UITextField {
                        textField.selectedTextRange = textField.textRange(from: textField.beginningOfDocument, to: textField.endOfDocument)
                    }
                }
Run Code Online (Sandbox Code Playgroud)