【问题标题】:Substring from range of two characters两个字符范围内的子字符串
【发布时间】:2017-07-11 11:40:10
【问题描述】:

我正在尝试将时间显示字符串转换为 Int。 语法看起来像这样,我想提取整数并乘以第一个并添加后者以获得以分钟为单位的时间。

12h 10m
3h 14m
16h 0m

由于显示的字符串可以是 hhmm、hmm、hhm 或 hm,因此我不能使用固定偏移量子字符串。 我试图通过首先找到“”然后找到 m 来对字符串进行子串化。 在其他语言中,这很容易,但出于某种原因,我无法让它在 swift 中运行。

请帮助我,你是我唯一的希望。

【问题讨论】:

  • 小时和分钟是否始终存在,或者可能是“12h”?可以有更多的单位(例如秒)吗?单位是否总是由空格字符分隔? –(你喜欢正则表达式吗?)

标签: swift string format range substring


【解决方案1】:

您可以使用 components(separated:) 获取您的时间组件(小时和分钟)并获取第一个组件(小时),将其乘以 60 并将最后一个组件(分钟)添加到它。

extension String {
    var minutes: Int {
        var minutes = 0
        if let hourChars = components(separatedBy: " ").first?.characters.dropLast(),
            let hours = Int(String(hourChars)) {
            minutes += hours * 60
        }
        if let minChars = components(separatedBy: " ").last?.characters.dropLast(),
            let mins = Int(String(minChars)) {
            minutes += mins
        }
        return minutes
    }
}

测试


let str1 = "12h 10m"
let minutes1 = str1.minutes   // 730

let str2 = "3h 14m"
let minutes2 = str2.minutes   // 194

let str3 = "16h 0m"
let minutes3 = str3.minutes   // 960

【讨论】:

    【解决方案2】:

    我认为在你的情况下最好把你有两次的字符串溢出

    let string = "12h 10m 3h 14m 16h 0m"
    var array = string.characters.split(separator: "h").map(String.init)
    
    var result: [String] = []
    array.forEach {
       result.append(contentsOf: $0.characters.split(separator: "m").map(String.init))
    }
    
    // ["12", " 10", " 3", " 14", " 16", " 0"]
    print(result)
    

    【讨论】:

      【解决方案3】:

      由于您只需要使用日期/时间字符串进行操作,我认为您最好使用内置 DateFormatter 来进行操作

      let dateFormatter = DateFormatter()
      dateFormatter.dateFormat = "HH'h' mm'm'"
      
      let date = dateFormatter.date(from: "2h 10m")!
      
      let hour = Calendar.current.component(.hour, from: date) 
      // returns 2
      let minutes = Calendar.current.component(.minute, from: date)
      // returns 10
      

      【讨论】:

        【解决方案4】:

        您的问题的最佳解决方案是

        func getTime(time:String)->(Int,Int)
        {
            let arry = time.components(separatedBy: " ")
            let hours = arry[0]
            let min = arry[1]
        
            let indexForHour = hours.index(hours.startIndex, offsetBy: (hours.characters.count - 1))
            let indexForMin = min.index(min.startIndex, offsetBy: (min.characters.count - 1))
        
        
            let hour = Int(hours.substring(to: indexForHour))
            let minut = Int(min.substring(to: indexForMin))
            return (hour!,minut!)
        }
        
        let str1 = "12h 10m"
        let str2 = "3h 14m"
        let str3 = "16h 0m"
        let firstTime:(hour:Int,min:Int) = getTime(time:str1)
        print(firstTime)
        let secondTime:(hour:Int,min:Int) = getTime(time:str2)
        print(secondTime)
        let thirdTime:(hour:Int,min:Int) = getTime(time:str3)
        print(thirdTime)
        

        输出

        (小时:12,分钟:10)

        (小时:3,分钟:14)

        (小时:16,分钟:0)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-06-04
          • 1970-01-01
          • 2013-11-14
          • 1970-01-01
          • 2012-06-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多