我想从动态字符串中获取第一个和最后一个数字。
字符串可以是以下任意数字。
";1-3,28-30,55〃===>输出为1&55
";104-105131-132157">===>输出为104&157
";188192194">===>输出为188&194
";202〃===>输出为202&0
";204-206208-212215-220"> 输出为204&220
对象
class PalletRangeObject: NSObject {
var start: Int = 0
var end: Int = 0
var strRange: String = ""
init(start: Int, end: Int, range: String) {
self.start = start
self.end = end
self.strRange = range
}
}
为了取得上述成就,我尝试了以下代码,但在某些情况下不起作用
for i in 0..<self.arrPalletRange.count {
let objPlRange = self.arrPalletRange[i]
if !objPlRange.strRange.isEmpty {
var nStart = 0
var nEnd = 0
let pointsArr = objPlRange.strRange.components(separatedBy: ",")
for i in 0..<pointsArr.count {
let arr = pointsArr[i].components(separatedBy: "-")
let newData = arr.map { Int($0)!}
if newData.count == 1 {
if nStart == 0 {
nStart = Int(newData.first ?? 0)
continue
}
nEnd = Int(newData.first ?? 0)
continue
}
else {
if nStart == 0 {
nStart = Int(newData.first ?? 0)
continue
}
nEnd = Int(newData.last ?? 0)
}
}
objPlRange.start = nStart
objPlRange.end = nEnd
}
}
有人能指导我实现这一目标吗。
提前感谢
它不必那么复杂。您似乎只想获得由,
或-
分隔的第一个子字符串和最后一个子字符串。
您可以使用components(separatedBy:)
for i in 0..<self.arrPalletRange.count {
let objPlRange = self.arrPalletRange[i]
let allComponents = objPlRange.strRange.components(separatedBy: CharacterSet([",", "-"]))
if let firstComponent = allComponents.first,
let firstComponentInt = Int(firstComponent),
let lastComponent = allComponents.last,
let lastComponentInt = Int(lastComponentInt) {
objPlRange.start = firstComponentInt
objPlRange.end = lastComponentInt
} else {
// the string is empty, or the values are not valid integers
}
}
或者,您可以找到-
或,
的第一个和最后一个索引,并在这些位置剪切字符串。这样可以避免创建所有组件的数组,因为您不需要它们中的大部分。
for i in 0..<self.arrPalletRange.count {
let objPlRange = self.arrPalletRange[i]
let firstIndex = objPlRange.strRange.firstIndex(where: { $0 == "-" || $0 == "," }) ?? objPlRange.strRange.endIndex
let lastIndex = objPlRange.strRange.lastIndex(where: { $0 == "-" || $0 == "," }) ?? objPlRange.strRange.startIndex
if let firstComponentInt = Int(objPlRange.strRange[..<firstIndex])
let lastComponentInt = Int(lastComponentInt[lastIndex...]) {
objPlRange.start = firstComponentInt
objPlRange.end = lastComponentInt
} else {
// the string is empty, or the values are not valid integers
}
}
我会使用firstIndex
和lastIndex
来查找非数字字符,然后使用prefix
和suffix
来提取值。
下面是一个函数,它将第一个和最后一个int作为元组返回
func firstAndLast(_ string: String) -> (Int, Int) {
guard let start = string.firstIndex(where: { !$0.isNumber }) else {
return string.isEmpty ? (0, 0) : (Int(string) ?? 0, 0)
}
guard let end = string.lastIndex(where: { !$0.isNumber }) else {
return (0, 0)
}
return (Int(string.prefix(upTo: start)) ?? 0, Int(string.suffix(from: string.index(end, offsetBy: 1))) ?? 0)
}
这是一个非常简单的代码,您可以使用它来实现这一点。
对于第一个数字
func findFirst(number: String) -> String{
guard number != "" else {return ""}
var firstNumber = ""
for i in number{
if i.isNumber{
firstNumber.append(i)
}else{
return firstNumber
}
}
return firstNumber
}
这是第二个号码
func findLast(number: String) -> String{
guard number != "" else {return ""}
var firstNumber = ""
for i in number.reversed(){
if i.isNumber{
firstNumber.append(i)
}else{
return firstNumber
}
}
return firstNumber
}
如果我没有正确理解你的问题,很抱歉,但根据我的理解,这里是我能给你的最简单的代码
let string = "2A4-206,208-212,215-220"
let numbers = string.components(separatedBy: [",","-"]).filter({ string in
if let _ = Int(string) {
return true
} else {
return false
}
})
if numbers.count == 0 {
print("Start: 0, End: 0")
} else if let first = Int(numbers.first ?? ""), numbers.count == 1 {
print("Start: (first), End: 0")
} else if let first = Int(numbers.first ?? ""), let last = Int(numbers.last ?? "") {
print("Start: (first), End: (last)")
}
您可以在函数中添加此代码,并将打印语句替换为返回块