在 swiftUI 文本字段中输入时显示带逗号的数字

问题描述 投票:0回答:2

我有一个通用的 swiftUI 应用程序。在该应用程序中的文本字段中,我只想允许数字和 。 ,还应该在用户键入时使用逗号(,)格式化文本。只允许我使用以下代码获得的数字

TextField(placeholder, text: $text)
                   // .padding(.leading, isPrefix ? 0 : -10) // Text Field padding
                    .padding(.horizontal, 12) // Text Field padding
                   // .padding(.horizontal, 12) // Text Field padding
                    .font(.arialDisplay(.regular, size: 14))
                    .foregroundColor(isDarkMode ? .white : .black) // Set text color based on color scheme

                    .onChange(of: text, perform: { _ in
                        if text.count > 0 {
                          //  self.isPrefix = true

                        } else {
                           // self.isPrefix = false
                        }

                        // Callback for editing changes event
                        // Implement your editing changes logic here
                    })
                    .onSubmit {
                    }

                    .onReceive(Just(text)) { newValue in
                        let allowedCharacters = "0123456789.$,"
                        let filtered = newValue.filter { allowedCharacters.contains($0) }
                        if filtered != newValue {
                            self.text = filtered
                        }
                    }

我使用以下代码实现了逗号格式: @State私有变量值= 0.0 //...

文本字段(“值”, 值:$值, 格式:.数字 .分组(.自动) .精度(.fractionLength(2) )

当我应用格式化程序时,它破坏了我仅使用数字的逻辑。由于应用程序也适用于 ipad,所以我不能依赖设置键盘类型。如何在用户键入时使用 格式化文本并仅允许数字和点?。对于前任。 250000 应显示为 250,000。任何帮助将不胜感激。

这是格式化数字并仅允许数字、点、逗号和美元的组合解决方案。当我组合解决方案时,只有格式化有效,只有数字的解决方案不起作用

导入 SwiftUI 进口联合收割机 扩展字符串 { func toDouble() -> 双精度? { 返回 NumberFormatter().number(from: self)?.doubleValue } }

构造解决方案2:查看{

@State private var text: Double = 0

var body: some View {
    TextField("",value: $text, format: .currency(code: Locale.current.currency?.identifier ?? "USD"))
        .onChange(of: text, perform: { newValue in 
            
        })
    
        .onReceive(Just(text)) { newValue in
            
            let newString: String = String(format: "%f", newValue)

            let allowedCharacters = "0123456789.$,"
            let filtered = newString.filter { allowedCharacters.contains($0) }
            if filtered != newString {
                self.text = filtered.toDouble() ?? 0
            }
        }

    
          }

}

swift swiftui textfield formatter
2个回答
1
投票

无需使用可用的工具重新发明轮子,

TextField
有一个构造函数,它采用数字属性和格式,可以自动为您格式化内容。

即使它不能 100% 满足您的要求,我仍然相信使用它比编写大量自定义代码更好。

这是一个示例,在用户区域设置中使用千位分隔符和 2 个小数位来格式化输入的数字

编辑 - 修复了 TextField 语法的问题。

@State private var value = 0.0
//...

TextField("Value",     
          value: $value,
          format: .number
          .grouping(.automatic)
          .precision(.fractionLength(2)
    ))

0
投票

let formatter: NumberFormatter = {let formatter = NumberFormatter() formatter.numberStyle = .decimal return formatter }()

请添加以上格式化程序

并通过

使用此格式化程序

TextField("placeholder", value: $text, formatter: formatted)

© www.soinside.com 2019 - 2024. All rights reserved.