如何限制在Swift for iOS8的UITextField中只有一个十进制的条目?

我已经search了这一切,但仍似乎无法得到它的工作。 我有一个简单的iOS程序,将Farenheit转换成摄氏温度和开尔文温度。 我想限制在这个UITextField只有一个十进制的条目。 例如98.9是好的,但98..9不是。

这是我想限制只有一个小数的function。 我想要的是,如果input1个小数,那么它将不允许input另一个1,但数字仍然可以在第一个小数点后input。

func farenheitButton(sender: AnyObject) { var fVal = self.farenheitTextLabel.text var cVal = self.celsiusTextLabel.text var kVal = self.kelvinTextLabel.text if let fVal = self.farenheitTextLabel.text?.toDouble() { var fValx = self.farenheitTextLabel.text var fDoubleValue : Double = NSString (string: fValx).doubleValue var fToC = (fDoubleValue - 32) * (5/9) //convert Farenheit to Celsius formula var fToK = ((fDoubleValue - 32) / (1.8000)) + 273.15 //convert Farenheit to Kelvin formula //create string from value with a format var afToC : Double = fToC var bfToC : String = String(format:"%.4f",afToC) var afToK : Double = fToK var bfToK : String = String(format:"%.4f",afToK) celsiusTextLabel.text = bfToC kelvinTextLabel.text = bfToK } } 

您可以设置UITextField.delegate = self并使用textField(textField: UITextField,shouldChangeCharactersInRange range: NSRange,replacementString string: String)方法来做你想做的。

以下代码将不允许您在文本字段中input多个小数点

 func textField(textField: UITextField,shouldChangeCharactersInRange range: NSRange,replacementString string: String) -> Bool { let countdots = textField.text.componentsSeparatedByString(".").count - 1 if countdots > 0 && string == "." { return false } return true } 

您应该将UITextFieldDelegate添加到class ViewController

 class ViewController: UIViewController, UITextFieldDelegate { ... } 

然后

如果您的@IBOutlet名称是textField ,(它可能看起来像: @IBOutlet weak var textField: UITextField! ),然后添加

 override func viewDidLoad() { super.viewDidLoad() self.textField.delegate = self // Do any additional setup after loading the view, typically from a nib. } 

之后你可以使用:

 func textField(textField: UITextField,shouldChangeCharactersInRange range: NSRange,replacementString string: String) -> Bool { let countdots = textField.text.componentsSeparatedByString(".").count - 1 if countdots > 0 || textField.text == "." { return false } return true } 

你可以使用UITextField的这个子类。 它使用与上述答案相同的原则,但代码更清晰一些。

 class WMNumberTextField: UITextField, UITextFieldDelegate { override func awakeFromNib() { super.awakeFromNib() delegate = self } func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { guard let text = text else { return false } let dots = text.characters.filter { $0 == "." } return dots.count == 0 || string != "." } } 

我使用下面的代码来限制在swift 3.0中的1个十进制条目。

 let inverseSet = CharacterSet(charactersIn:".0123456789").inverted let components = string.components(separatedBy: inverseSet) let filtered = components.joined(separator: "") if (textField.text?.contains("."))!, string.contains(".") { return false } return string == filtered 

Swift 3

 func textField(_ textField: UITextField,shouldChangeCharactersIn range: NSRange,replacementString string: String) -> Bool { let countdots = (textField.text?.components(separatedBy: (".")).count)! - 1 if (countdots > 0 && string == "."){ return false } return true }