textField如何限制金额输入

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了textField如何限制金额输入相关的知识,希望对你有一定的参考价值。

参考技术A 在文本框里输入金额的话,顾名思义,就是小数点之后只有两位数.我们知道textFiled 的代理 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string; 是对文字进行限制的.如果返回 NO, 则文字不能改变.那么就在这里动手脚.

这是最开始的写法,确实可以限制文字的输入.但是在某次测试时,发现,当光标位置生改变之后,就会出问题,而且对于复制粘贴,无法控制.
所以下面改了一下思路, 使用正则表达式进行控制.

这是NSString 的分类

由于通过参数里面传来的字符串先拼接成最终的字符串,进行判断是否是 money 格式,所以也可以很好的避免,通过拷贝造成的不是字符串的问题.

如何限制字符数,同时只允许 TextField 中的字符子集?

【中文标题】如何限制字符数,同时只允许 TextField 中的字符子集?【英文标题】:How to limit the number of characters while also allowing only a subset of characters in a TextField? 【发布时间】:2020-08-10 03:48:33 【问题描述】:

我一直在尝试限制我可以在 SwiftUI 中的 TextField 上输入的字符数,同时只允许数字。

我尝试了基于this和this的混合解决方案

.onReceive(Just(viewModel.myString))  newValue in
    let filtered = newValue.filter  "0123456789".contains($0) 
    if filtered != newValue 
        self.viewModel.myString = filtered
    

过滤字符以及

@Published var myString: String = "" 
    willSet 
        if newValue.count > Constants.maxLimit 
            myString = String(newValue.prefix(Constants.maxLimit))
        
    

限制字符数。

但是通过这种方法,我仍然可以添加多个Constants.maxLimit 并添加数字以外的字符。

如果我尝试将这两个逻辑与视图模型中的 willSet/didSet 或文本字段中的 onReceive 结合起来,则会因堆栈溢出而导致崩溃。

我还是 SwiftUI 的新手,所以我不确定自定义 Publisher 是否有助于解决我的问题。

【问题讨论】:

你不能这样做吗? :.onReceive(Just(viewModel.myString)) newValue in let filtered = newValue.filter "0123456789".contains($0) if filtered != newValue, filtered.count <= Constants.maxLimit self.viewModel.myString = filtered 【参考方案1】:

您可以简单地过滤所有整数字符并获取结果字符串的前 10 个字符。您还需要检查字符串是否为空并将值设置回零:


import SwiftUI
import Combine

struct ContentView: View 
    @State private var text = "0"
    let maxLength = 10
    var body: some View 
        TextField("", text: $text)
            .keyboardType(.numberPad)
            .onReceive(Just(text)) 
                guard !$0.isEmpty else 
                    self.text = "0"
                    return
                
                if let value = Int($0.filter(\.isWholeNumber).prefix(maxLength)) 
                    self.text = String(value)
                
        
    

【讨论】:

是的,这对我有用。有没有办法将此逻辑移至视图模型?

以上是关于textField如何限制金额输入的主要内容,如果未能解决你的问题,请参考以下文章

flutter TextField限制输入为合法小数

SwiftUI:TextField文本输入

SwiftUI如何让绑定到同一个状态的多个TextField呈现出不同输入行为

SwiftUI如何让绑定到同一个状态的多个TextField呈现出不同输入行为

如何限制TextField中字符输入的数目?

如何根据 TextField 的可见大小限制 UITextField 的输入文本量?