我需要从字符串中提取数字并将它们放入Swift中的新数组中。
var str = "I have to buy 3 apples, 7 bananas, 10eggs"
我试图循环每个字符,我不知道在Character和Int之间进行比较。
答案 0 :(得分:31)
Swift 3/4
let string = "0kaksd020dk2kfj2123"
if let number = Int(string.components(separatedBy: CharacterSet.decimalDigits.inverted).joined()) {
// Do something with this number
}
你也可以进行如下扩展:
extension Int {
static func parse(from string: String) -> Int? {
return Int(string.components(separatedBy: CharacterSet.decimalDigits.inverted).joined())
}
}
然后再使用它:
if let number = Int.parse(from: "0kaksd020dk2kfj2123") {
// Do something with this number
}
答案 1 :(得分:18)
首先,我们拆分字符串,以便我们处理单个项目。然后我们使用NSCharacterSet
来选择数字。
import Foundation
let str = "I have to buy 3 apples, 7 bananas, 10eggs"
let strArr = str.split(separator: " ")
for item in strArr {
let part = item.components(separatedBy: CharacterSet.decimalDigits.inverted).joined()
if let intVal = Int(part) {
print("this is a number -> \(intVal)")
}
}
Swift 4 :
let string = "I have to buy 3 apples, 7 bananas, 10eggs"
let stringArray = string.components(separatedBy: CharacterSet.decimalDigits.inverted)
for item in stringArray {
if let number = Int(item) {
print("number: \(number)")
}
}
答案 2 :(得分:10)
let str = "Hello 1, World 62"
let intString = str.componentsSeparatedByCharactersInSet(
NSCharacterSet
.decimalDigitCharacterSet()
.invertedSet)
.joinWithSeparator("")
这将为您提供一个包含所有数字的字符串,然后您就可以执行此操作:
let int = Int(intString)
请确保打开它,因为let int = Int(intString)
是可选的。
答案 3 :(得分:8)
使用Swift extract regex matches中的“正则表达式辅助函数”:
func matchesForRegexInText(regex: String!, text: String!) -> [String] {
let regex = NSRegularExpression(pattern: regex,
options: nil, error: nil)!
let nsString = text as NSString
let results = regex.matchesInString(text,
options: nil, range: NSMakeRange(0, nsString.length))
as! [NSTextCheckingResult]
return map(results) { nsString.substringWithRange($0.range)}
}
你可以通过
轻松实现这一目标let str = "I have to buy 3 apples, 7 bananas, 10eggs"
let numbersAsStrings = matchesForRegexInText("\\d+", str) // [String]
let numbersAsInts = numbersAsStrings.map { $0.toInt()! } // [Int]
println(numbersAsInts) // [3, 7, 10]
模式"\d+"
匹配一个或多个十进制数字。
当然可以在不使用辅助函数的情况下完成相同的操作 如果你因为某种原因而喜欢这个:
let str = "I have to buy 3 apples, 7 bananas, 10eggs"
let regex = NSRegularExpression(pattern: "\\d+", options: nil, error: nil)!
let nsString = str as NSString
let results = regex.matchesInString(str, options: nil, range: NSMakeRange(0, nsString.length))
as! [NSTextCheckingResult]
let numbers = map(results) { nsString.substringWithRange($0.range).toInt()! }
println(numbers) // [3, 7, 10]
没有正则表达式的替代解决方案:
let str = "I have to buy 3 apples, 7 bananas, 10eggs"
let digits = "0123456789"
let numbers = split(str, allowEmptySlices: false) { !contains(digits, $0) }
.map { $0.toInt()! }
println(numbers) // [3, 7, 10]
答案 4 :(得分:2)
Swift 2.2
{{1}}
答案 5 :(得分:1)
// This will only work with single digit numbers. Works with “10eggs” (no space between number and word
var str = "I have to buy 3 apples, 7 bananas, 10eggs"
var ints: [Int] = []
for char:Character in str {
if let int = "\(char)".toInt(){
ints.append(int)
}
}
这里的技巧是你可以检查一个字符串是否是一个整数(但你不能检查一个字符是否是)。
通过循环字符串的每个字符,使用字符串插值从字符创建一个字符串,并检查该字符串是否被转换为整数。
如果可以,请将其添加到数组中。
// This will work with multi digit numbers. Does NOT work with “10 eggs” (has to have a space between number and word)
var str = "I have to buy 3 apples, 7 bananas, 10 eggs"
var ints: [Int] = []
var strArray = split(str) {$0 == " "}
for subString in strArray{
if let int = subString.toInt(){
ints.append(int)
}
}
这里我们在任意空间拆分字符串,并创建一个长字符串中每个子字符串的数组 我们再次检查每个字符串以查看它是否(或可以被转换为)整数。
答案 6 :(得分:1)
改编自@ flashadvanced' s answer, 我发现以下内容对我来说更短更简单。
let str = "I have to buy 3 apples, 7 bananas, 10eggs"
let component = str.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet)
let list = component.filter({ $0 != "" }) // filter out all the empty strings in the component
print(list)
在游戏场中尝试并且有效
希望有所帮助:)
答案 7 :(得分:0)
感谢所有回答我问题的人。
我正在寻找一个只使用快速语法的代码块,因为我现在只学习语法..
我得到了一个问题的答案。也许这不是一种更容易解决的方法,但它只使用了快速的语言。
getSupportActionBar().setDisplayShowTitleEnabled(false);
答案 8 :(得分:0)
对我来说,将其作为String扩展名更有意义,这可能是出于口味的考虑:
func parseToInt() -> Int? {
return Int(self.components(separatedBy: CharacterSet.decimalDigits.inverted).joined())
}
因此可以这样使用:
if let number = "0kaksd020dk2kfj2123".parseToInt() {
// Do something with this number
}