【发布时间】:2014-12-20 03:05:54
【问题描述】:
我有一个数组["abc", "94761178","790"]
我想迭代每个并检查是字符串还是整数?
如何检查?
如何将“123”转换为整数123
【问题讨论】:
标签: swift
我有一个数组["abc", "94761178","790"]
我想迭代每个并检查是字符串还是整数?
如何检查?
如何将“123”转换为整数123
【问题讨论】:
标签: swift
这是一个使用字符串扩展的小型 Swift 版本:
斯威夫特 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
}
}
}
【讨论】:
self.rangeOfCharacter(from: NSCharacterSet.decimalDigits.inverted) == nil
编辑 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 进行计算。
来自文档:
如果字符串表示一个适合 Int 的整数,则返回 相应的整数。这接受与常规匹配的字符串 仅表达式“[-+]?[0-9]+”。
【讨论】:
请注意,使用 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
}
}
【讨论】:
!number.isEmpty 支票
.invertedSet而不是将返回更改为!= nil有什么意义?是更好的运行时还是什么?
if !text_of_just_numbers.isEmpty && text_of_just_numbers.isEmpty.rangeOfCharacter(from: NSCharacterSet.decimalDigits.inverted) == nil { //is numeric }
从 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
}
}
【讨论】:
斯威夫特 3、4
extension String {
var isNumber: Bool {
let characters = CharacterSet.decimalDigits.inverted
return !self.isEmpty && rangeOfCharacter(from: characters) == nil
}
}
【讨论】:
这样的简单解决方案:
extension String {
public var isNumber: Bool {
return !isEmpty && rangeOfCharacter(from: CharacterSet.decimalDigits.inverted) == nil
}
}
【讨论】:
我认为使用NumberFormatter 是一种简单的方法:
(斯威夫特 5)
import Foundation
extension String {
var isNumeric : Bool {
return NumberFormatter().number(from: self) != nil
}
}
【讨论】:
正确的方法是使用String的toInt()方法,以及一个可选的绑定来判断转换是否成功。所以你的循环看起来像:
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;如果转换成功。
方法文档(在 Xcode 中使用 CMD+点击toInt 显示)说:
如果字符串表示适合 Int 的整数,则返回相应的整数。这仅接受与正则表达式“[-+]?[0-9]+”匹配的字符串。
【讨论】:
Swift 3.0 版本
func isNumber(stringToTest : String) -> Bool {
let numberCharacters = CharacterSet.decimalDigits.inverted
return !s.isEmpty && s.rangeOfCharacter(from:numberCharacters) == nil
}
【讨论】:
如果您想接受更细粒度的方法(即接受像 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
}
为了获得更好的分辨率,您可以使用正则表达式..
【讨论】:
........... 和e.e.e.e.e 等字符串,这将错误地返回true。
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
}
【讨论】:
您可以将它用于任何长度的整数。
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 位拱形的有符号整数限制)。但是,对于较大的值,您仍然会得到字符串表示形式。
【讨论】:
从 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();
}
}
}
【讨论】: