У меня есть массив ["abc", "94761178","790"]
Я хочу выполнить итерацию каждого и проверить, является ли String или Integer?
Как это проверить?
Как преобразовать "123" в целое число 123
У меня есть массив ["abc", "94761178","790"]
Я хочу выполнить итерацию каждого и проверить, является ли String или Integer?
Как это проверить?
Как преобразовать "123" в целое число 123
Изменить Swift 2.2:
В быстрой версии 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
.
Из документов:
Если строка представляет целое число, которое вписывается в Int, возвращает соответствующее целое число. Это принимает строки, соответствующие регулярному выражение "[- +]? [0-9] +" только.
Вот небольшая версия Swift, использующая расширение String:
Свифт 3/Свифт 4:
extension String {
var isNumber: Bool {
return !isEmpty && rangeOfCharacter(from: CharacterSet.decimalDigits.inverted) == nil
}
}
Свифт 2:
extension String {
var isNumber : Bool {
get{
return !self.isEmpty && self.rangeOfCharacterFromSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet) == nil
}
}
}
Помните, что проверка строки/числа с помощью инициализатора 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
}
}
Начиная с 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.")
}
}
Я думаю, что самое хорошее решение:
extension String {
var isNumeric : Bool {
return Double(self) != nil
}
}
Swift 3, 4
extension String {
var isNumber: Bool {
let characters = CharacterSet.decimalDigits.inverted
return !self.isEmpty && rangeOfCharacter(from: characters) == nil
}
}
Правильный способ - использовать метод toInt()
String
и необязательную привязку, чтобы определить, удалось ли преобразование или нет. Итак, ваша петля будет выглядеть так:
let myArray = ["abc", "94761178","790"]
for val in myArray {
if let intValue = val.toInt() {
// It an int
println(intValue)
} else {
// It not an int
println(val)
}
}
Метод toInt()
возвращает Int?
, поэтому необязательный Int
, который nil
, если строка не может быть преобразована в целую сумму или значение Int
(завернутое в необязательное), если преобразование завершается успешно.
Документация по методу (показана с использованием CMD + щелчка на toInt
в Xcode):
Если строка представляет целое число, которое помещается в Int, возвращает соответствующее целое число. Это принимает строки, которые соответствуют регулярному выражению "[- +]? [0-9] +".
Этот способ работает также со строками со смешанными номерами:
public extension String {
func isNumber() -> Bool {
return !self.isEmpty && self.rangeOfCharacter(from: CharacterSet.decimalDigits) != nil && self.rangeOfCharacter(from: CharacterSet.letters) == nil
}}
версия Swift 3.0
func isNumber(stringToTest : String) -> Bool {
let numberCharacters = CharacterSet.decimalDigits.inverted
return !s.isEmpty && s.rangeOfCharacter(from:numberCharacters) == nil
}
Если вы хотите принять более тонкий подход (т.е. принять число, например, 4,5 или 3е10), выполните следующие действия:
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
}
Для лучшего разрешения вы можете использовать регулярное выражение.
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
}
Этот код работает для меня для 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
}
Я думаю, использование NumberFormatter
- это простой способ: (Swift 5)
import Foundation
extension String {
var isNumeric : Bool {
return NumberFormatter().number(from: self) != nil
}
}
Получите следующую функцию isInteger() из следующего сообщения stackoverflow, отправленного corsiKa: Определить, является ли String целым в Java
И я думаю, что это то, что вы хотите сделать (где nameOfArray - это массив, который вы хотите передать)
void convertStrArrayToIntArray( int[] integerArray ) {
for (int i = 0; i < nameOfArray.length(); i++) {
if (!isInteger(nameOfArray[i])) {
integerArray[i] = nameOfArray[i].toString();
}
}
}