首页 > 解决方案 > 如何从 String Swift 中选择第一个和最后一个数字

问题描述

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

字符串可以是任何数字,如下所示。

"1-3,28-30,55" ==>输出为 1 & 55

"104-105,131-132,157" ==>输出为 104 & 157

"188,192,194" ==>输出为 188 & 194

"202" ==>输出为 202 & 0

"204-206,208-212,215-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
    }
}

谁能指导我实现这一目标。

提前致谢

标签: swiftnumbers

解决方案


它不必那么复杂。您似乎只想让第一个和最后一个子字符串由,or分隔-

您可以使用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
    }
}

或者,您可以找到 a -or的第一个和最后一个索引,,并在这些位置剪切字符串。这避免了创建所有组件的数组,因为您不需要其中的大部分。

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

推荐阅读