Swift表单验证 - 检查是否输入了Int或String

时间:2014-12-04 21:03:04

标签: string validation swift integer

我正在尝试验证表单以确保用户输入的是整数而不是字符串。我可以检查数字是否是一个整数,如下所示:

 var possibleNumber = timeRetrieved.text
    convertedNumber = possibleNumber.toInt()
    // convertedNumber is inferred to be of type "Int?", or "optional Int"

    if convertedNumber != nil {

        println("It's a number!")

        totalTime = convertedNumber!


    }

我的问题是我想确保用户没有输入任何文字,双打等。我只想要整数。以下代码不起作用,因为如果变量是整数,则计算结果为true。我应该使用什么代码来评估变量是否不是整数?

if convertedNumber != nil  {


        let alertController = UIAlertController(title: "Validation Error", message: "You must enter an integer number!", preferredStyle: .Alert)
        let alertAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.Destructive, handler: {(alert : UIAlertAction!) in
            alertController.dismissViewControllerAnimated(true, completion: nil)
        })
        alertController.addAction(alertAction)
        presentViewController(alertController, animated: true, completion: nil)

6 个答案:

答案 0 :(得分:4)

Swift 2改变了这一点:因为Int(" abc")和Int(" 0")都返回0,所以不能使用整数转换。你可以用这个:

class Validation {
    static func isStringNumerical(string : String) -> Bool {
        // Only allow numbers. Look for anything not a number.
        let range = string.rangeOfCharacterFromSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet)
        return (range == nil)
    }
}

它使用decimalDigitCharacterSet,可以更改为使用您想要的任何字符集。

func testIsStringNumerical() {
    XCTAssertEqual(SignUpLoyaltyViewController.isStringNumerical("123"), true)
    XCTAssertEqual(SignUpLoyaltyViewController.isStringNumerical(""), true)
    XCTAssertEqual(SignUpLoyaltyViewController.isStringNumerical("12AA"), false)
    XCTAssertEqual(SignUpLoyaltyViewController.isStringNumerical("123.4"), false)
}

这比正则表达式答案要快得多。 (2000次运行,0.004s vs regex 0.233s)

Timing from device

答案 1 :(得分:3)

如果用户输入的数字不是整数,则convertedNumber将为nil。只需添加一个else子句,您可以在其中显示警报。

答案 2 :(得分:2)

Int初始化程序

这适用于Swift 2.2及更高版本。它基于Minhal Khan的答案,该答案说明Int有一个带有此签名的初始值设定项:init?(_ text: String, radix: Int = default)。由于radix具有默认值,因此可以省略。 *more info on this initializer is found here.

var totalTime: Int?
let possibleInt = timeRetrieved.text ?? ""
if let convertedNumber = Int(possibleInt) {
    print("'\(possibleInt)' is an Int")
    totalTime = convertedNumber
}
else {
    print("'\(possibleInt)' is not an Int")
}

print("totalTime: '\(totalTime)'")

注意:我认为timeRetrievedUITextFieldUITextField text属性是可选字符串(虽然在编程上不允许为nil)。因此,编译器需要将其解包。我使用nil合并运算符(??)将nil替换为空字符串,该字符串不会根据需要生成整数。 Here's a post that discusses the optionality of UITextfield.text.

答案 3 :(得分:1)

我所做的就是获取价值并检查它是否可以转换它,适合我

var enteredText = Int(textfield.text) 
if enteredText == nil{
    //String entered 
} 
else{
//Int entered
}

答案 4 :(得分:1)

基于@Graham Perks回复 Swift 3 版本作为字符串扩展名:

extension String
{
    var isNumeric: Bool
    {
        let range = self.rangeOfCharacter(from: CharacterSet.decimalDigits.inverted)
        return (range == nil)
    }
}

用法:

"123".isNumeric // true
"abc".isNumeric // false

答案 5 :(得分:0)

我真的建议使用REGEX,我最近尝试使用if let _ = Int(stringToTest)...验证10位数的电话号码,而在32位硬件上,我遇到了范围问题。

func validate(value: String) -> Bool {
  let PHONE_REGEX = "\\d{10}"
  let phoneTest = NSPredicate(format: "SELF MATCHES %@", PHONE_REGEX)
  let result =  phoneTest.evaluateWithObject(value)
  if result == true {
    log.info("'\(self.text!)' is a valid number.")
  } else {
    log.info("'\(self.text!)' is an invalid number.")
  }
  return result
}