如何从字符串Swift中选择第一个和最后一个数字



我想从动态字符串中获取第一个和最后一个数字。

字符串可以是以下任意数字。

";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
}
}

我会使用firstIndexlastIndex来查找非数字字符,然后使用prefixsuffix来提取值。

下面是一个函数,它将第一个和最后一个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)")
}

您可以在函数中添加此代码,并将打印语句替换为返回块

相关内容

最新更新