我正在尝试验证表单以确保用户输入的是整数而不是字符串。我可以检查数字是否是一个整数,如下所示:
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)
答案 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)
答案 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)'")
注意:我认为timeRetrieved
是UITextField
。 UITextField
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
}