shouldChangeCharactersInRange接受单个'。'

时间:2016-04-21 14:37:14

标签: ios swift uitextfield decimal

我有一个只接受数值的文本字段。我想知道如何能够输入单个'。'的能力。表示小数点。

我有以下代码:

class ViewController: UIViewController, UITextFieldDelegate {

    var formatter: NSNumberFormatter!

    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    return string == "" || Double(string) != nil
    }

    override func viewDidLoad() {
        amountTextField.delegate = self
        // Initialize the formatter; minimum value is set to zero; style is Decimal.
        formatter = NSNumberFormatter()
        formatter.numberStyle = NSNumberFormatterStyle.DecimalStyle
        formatter.minimum = 0
    }
}

2 个答案:

答案 0 :(得分:1)

您必须使用此文本字段委托方法:

 func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { // return NO to not change text

        let newString = (textField.text! as NSString).stringByReplacingCharactersInRange(range, withString: string)

        if newString.characters.count > 0 {

            let scanner: NSScanner = NSScanner(string:newString)
            let isNumeric = scanner.scanDecimal(nil) && scanner.atEnd

            return isNumeric

        } else {

            return true
        }
    }

答案 1 :(得分:0)

您可以将目标操作与.EditingChanged事件一起使用,而不是使用此委托方法,因为它不方便(在更改后不会为您提供文本的值)并且不总是有效(例如,自动更正)。

.EditingChanged的处理程序中,您可以使用regexp处理输入的文本。使用这种方法,您将不得不保留旧的文本值。

示例代码:

let decimalRegex = try! NSRegularExpression(pattern: "^[0-9]+(\\.[0-9]+)?$", options: [])

func isValidText(text: String) -> Bool {
    return text == "" || decimalRegex.numberOfMatchesInString(text, options: [], range: NSMakeRange(0, text.utf16.count)) != 0
}

textField.addTarget(self, action: #selector(self.textFieldTextChanged(_:)), forControlEvents: .EditingChanged)
var oldText = ""

func textFieldTextChanged(textField: UITextField) {
    if isValidText(textField.text!) {
        oldText = textField.text!
    } else {
        textField.text = oldText
    }
}