我有一个数组["abc", "94761178","790"]
我想迭代每个并检查是字符串还是整数?
如何检查?
如何将“123”转换为整数123
答案 0 :(得分:46)
编辑Swift 2.2:
在swift 2.2中使用Int(yourArray[1])
var yourArray = ["abc", "94761178","790"]
var num = Int(yourArray[1])
if num != nil {
println("Valid Integer")
}
else {
println("Not Valid Integer")
}
它会显示字符串是有效整数,num
包含有效Int
。您可以使用num
进行计算。
来自docs:
如果字符串表示适合Int的整数,则返回 相应的整数。这接受与常规字符串匹配的字符串 表达" [ - +]?[0-9] +"仅
答案 1 :(得分:44)
这是一个使用String扩展名的小型Swift版本:
Swift 3 / Swift 4:
app:layout_behavior="android.support.design.widget.BottomSheetBehavior"
斯威夫特2:
extension String {
var isNumber: Bool {
return !isEmpty && rangeOfCharacter(from: CharacterSet.decimalDigits.inverted) == nil
}
}
答案 2 :(得分:40)
请注意,使用Int
初始化程序检查字符串/数字有限制。具体来说,最大值为2 ^ 32-1或4294967295.这可能会导致问题,因为电话号码8005551234将无法Int(8005551234)
检查,尽管它是有效号码。
更安全的方法是使用NSCharacterSet
检查与字符串范围内的小数集匹配的任何字符。
let number = "8005551234"
let numberCharacters = NSCharacterSet.decimalDigitCharacterSet().invertedSet
if !number.isEmpty && number.rangeOfCharacterFromSet(numberCharacters) == nil {
// string is a valid number
} else {
// string contained non-digit characters
}
此外,将其添加到String
扩展名可能很有用。
public extension String {
func isNumber() -> Bool {
let numberCharacters = NSCharacterSet.decimalDigitCharacterSet().invertedSet
return !self.isEmpty && self.rangeOfCharacterFromSet(numberCharacters) == nil
}
}
答案 3 :(得分:19)
从Swift 2开始,删除了String.toInt()。 正在引入一个新的Int Initializer:Int(str:String)
for target in ["abc", "94761178","790"]
{
if let number = Int(target)
{
print("value: \(target) is a valid number. add one to get :\(number+1)!")
}
else
{
print("value: \(target) is not a valid number.")
}
}
答案 4 :(得分:9)
我认为最好的解决方案是:
extension String {
var isNumeric : Bool {
return Double(self) != nil
}
}
答案 5 :(得分:6)
extension String {
var isNumber: Bool {
let characters = CharacterSet.decimalDigits.inverted
return !self.isEmpty && rangeOfCharacter(from: characters) == nil
}
}
答案 6 :(得分:4)
正确的方法是使用toInt()
的{{1}}方法和可选的绑定来确定转换是否成功。所以你的循环看起来像:
String
let myArray = ["abc", "94761178","790"]
for val in myArray {
if let intValue = val.toInt() {
// It's an int
println(intValue)
} else {
// It's not an int
println(val)
}
}
方法返回toInt()
,因此可选Int?
,如果字符串无法转换为整数,则为Int
,或nil
如果转换成功,则返回值(包含在可选项中)。
方法文档(使用CMD +在Xcode中点击Int
显示)说:
如果字符串表示适合Int的整数,则返回相应的整数。这接受的字符串只匹配正则表达式“[ - +]?[0-9] +”。
答案 7 :(得分:3)
这种方式也适用于带有混合数字的字符串:
public extension String {
func isNumber() -> Bool {
return !self.isEmpty && self.rangeOfCharacter(from: CharacterSet.decimalDigits) != nil && self.rangeOfCharacter(from: CharacterSet.letters) == nil
}}
答案 8 :(得分:3)
像这样的简单解决方案:
extension String {
public var isNumber: Bool {
return !isEmpty && rangeOfCharacter(from: CharacterSet.decimalDigits.inverted) == nil
}
}
答案 9 :(得分:1)
Swift 3.0版
func isNumber(stringToTest : String) -> Bool {
let numberCharacters = CharacterSet.decimalDigits.inverted
return !s.isEmpty && s.rangeOfCharacter(from:numberCharacters) == nil
}
答案 10 :(得分:0)
如果您想接受更细粒度的方法(即接受 4.5 或 3e10 等数字),请按以下步骤操作:
func isNumber(val: String) -> Bool
{
var result: Bool = false
let parseDotComNumberCharacterSet = NSMutableCharacterSet.decimalDigitCharacterSet()
parseDotComNumberCharacterSet.formUnionWithCharacterSet(NSCharacterSet(charactersInString: ".e"))
let noNumberCharacters = parseDotComNumberCharacterSet.invertedSet
if let v = val
{
result = !v.isEmpty && v.rangeOfCharacterFromSet(noNumberCharacters) == nil
}
return result
}
为了获得更好的分辨率,您可以使用正则表达式。
答案 11 :(得分:0)
Xcode 8和Swift 3.0
我们也可以查看:
//MARK: - NUMERIC DIGITS
class func isString10Digits(ten_digits: String) -> Bool{
if !ten_digits.isEmpty {
let numberCharacters = NSCharacterSet.decimalDigits.inverted
return !ten_digits.isEmpty && ten_digits.rangeOfCharacter(from: numberCharacters) == nil
}
return false
}
答案 12 :(得分:0)
此代码适用于Swift 3/4
func isNumber(textField: UITextField) -> Bool {
let allowedCharacters = CharacterSet.decimalDigits
let characterSet = CharacterSet(charactersIn: textField.text!)
return allowedCharacters.isSuperset(of: characterSet)
// return true
}
答案 13 :(得分:0)
我认为使用NumberFormatter
是一种简单的方法:
(迅速5 )
import Foundation
extension String {
var isNumeric : Bool {
return NumberFormatter().number(from: self) != nil
}
}
答案 14 :(得分:0)
您可以将其用于任何长度的整数。
func getIntegerStrings(from givenStrings: [String]) -> [String]
{
var integerStrings = [String]()
for string in givenStrings
{
let isValidInteger = isInteger(givenString: string)
if isValidInteger { integerStrings.append(string) }
}
return integerStrings
}
func isInteger(givenString: String) -> Bool
{
var answer = true
givenString.forEach { answer = ("0"..."9").contains($0) && answer }
return answer
}
func getIntegers(from integerStrings: [String]) -> [Int]
{
let integers = integerStrings.compactMap { Int($0) }
return integers
}
let strings = ["abc", "94761178", "790", "18446744073709551615000000"]
let integerStrings = getIntegerStrings(from: strings)
let integers = getIntegers(from: integerStrings)
print(integerStrings) // ["94761178", "790", "18446744073709551615000000"]
print(integers) // [94761178, 790]
但是,正如@Can所指出的那样,您只能获得最大2 ^ 31-1(32位arch的有符号整数限制)的整数值。但是,对于较大的值,您仍将获得字符串表示形式。
答案 15 :(得分:-4)
从corsiKa发布的下面stackoverflow帖子中获取以下isInteger()函数: Determine if a String is an Integer in Java
我认为这就是你想要做的事情(nameOfArray是你要传递的数组)
void convertStrArrayToIntArray( int[] integerArray ) {
for (int i = 0; i < nameOfArray.length(); i++) {
if (!isInteger(nameOfArray[i])) {
integerArray[i] = nameOfArray[i].toString();
}
}
}