gpt4 book ai didi

ios - Swift 格式输入为 "as-you-type"格式的百分比

转载 作者:行者123 更新时间:2023-12-05 03:34:43 33 4
gpt4 key购买 nike

我有一个文本字段,它调用一个方法以按您键入的方式将输入格式化为百分比。

cell.textField.addTarget(self, action: #selector(textChangedIntoPercent(sender:)), for: .editingChanged)

调用的方法:

@objc func textChangedIntoPercent (sender : UITextField) {

if let amountString = sender.text?.percentInputFormatting() {
sender.text = amountString
}
}

以下代码在输入带有尾随 % 符号的数字时效果很好。但是,使用退格键时,不会删除任何内容,字符串只会返回其自身,最后一个数字不会退格。如果我将光标的位置更改为刚好在百分号之前,我就可以删除这些数字。

func percentInputFormatting() -> String {

var number: NSNumber!
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.maximumFractionDigits = 2
formatter.minimumFractionDigits = 2

var amountWithPrefix = self

let regex = try! NSRegularExpression(pattern: "[^0-9]", options: .caseInsensitive)
amountWithPrefix = regex.stringByReplacingMatches(in: amountWithPrefix, options: NSRegularExpression.MatchingOptions(rawValue: 0), range: NSMakeRange(0, self.count), withTemplate: "")

let double = (amountWithPrefix as NSString).doubleValue
number = NSNumber(value: (double / 100))

guard number != 0 as NSNumber else {
return "0%"
}

return "\(formatter.string(from: number)!)" + "%"
}

最佳答案

使用 shouldChangeCharactersIn委托(delegate)方法来检测退格。事实上,我建议您在这个委托(delegate)方法中实现整个事情,而不是 editingChanged 的操作。

首先,如果您还没有设置委托(delegate):

cell.textField.delegate = self

...

现在实现shouldChangeCharactersIn。当用户以某种方式编辑文本字段时将调用此方法,但文本字段的文本实际更改之前。您可以从参数 rangestring 中获取用户尝试进行的更改。用户试图用 string 中的字符串替换 textField.text 中的范围“range”。

如果 string 为空,则表示用户正在尝试删除内容。我们删除最后一位数字,并再次格式化数字。否则,使用 replacingCharacters(in: range, with: string) 应用用户的编辑,并检查它是否是有效数字。如果是,请对其进行格式化。

我们应该返回一个 Bool 指示是否应该应用编辑。在这种情况下,由于文本字段的文本应该如何更改由我们 100% 处理,我们不想应用用户的编辑。

extension YourViewController: UITextFieldDelegate {
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
guard let oldText = textField.text else { return false }

if string.isEmpty { // this means that backspace is pressed
let oldDigits = textField.text?.digits
// drops one digit every time backspace is pressed
let newNumber = Double(oldDigits.dropLast()) ?? 0
textField.text = percentFormatter.string(for: newNumber / 10000)
} else // something has been entered
if let newNumber = Double(
(oldText as NSString).replacingCharacters(in: range, with: string).digits
) {
textField.text = percentFormatter.string(for: newNumber / 10000)
}
return false
}
}

其中 percentFormatterwithoutNonDigits 是:

let percentFormatter: NumberFormatter = {
let f = NumberFormatter()
f.minimumFractionDigits = 2
f.maximumFractionDigits = 2
f.numberStyle = .percent
f.locale = Locale(identifier: "en-US_POSIX")
return f
}()

extension String {
var digits: String {
filter { "0"..."9" ~= $0 }
}
}

关于ios - Swift 格式输入为 "as-you-type"格式的百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70098837/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com