String+Extension.swift 2.83 KB
//
//  s.swift
//  Twear
//
//  Created by yangbin on 2021/12/6.
//
import UIKit
//import CommonCrypto

extension StringProtocol {
    var hexaData: Data { .init(hexa) }
    var hexaBytes: [UInt8] { .init(hexa) }
    private var hexa: UnfoldSequence<UInt8, Index> {
        sequence(state: startIndex) { start in
            guard start < self.endIndex else { return nil }
            let end = self.index(start, offsetBy: 2, limitedBy: self.endIndex) ?? self.endIndex
            defer { start = end }
            return UInt8(self[start..<end], radix: 16)
        }
    }
}

extension String {
    
    var length: Int {
        return self.count
    }
    
    
    
    subscript (i: Int) -> String{
        return self[i ..< i + 1]
    }
    
    func substring(fromIndex: Int) -> String {
        return self[min(fromIndex, length) ..< length]
    }
    
    func substring(toIndex: Int) -> String {
        return self[0 ..< max(0, toIndex)]
    }
    
    subscript (r: Range<Int>) -> String {
        let range = Range(uncheckedBounds: (lower: max(0, min(length, r.lowerBound)), upper: min(length, max(0, r.upperBound))))
        let start = index(startIndex, offsetBy: range.lowerBound)
        let end = index(start, offsetBy: range.upperBound - range.lowerBound)
        return String(self[start ..< end])
    }
    
    func toRange(_ range: NSRange) -> Range<String.Index>? {
        guard let from16 = utf16.index(utf16.startIndex, offsetBy: range.location, limitedBy: utf16.endIndex) else { return nil }
        guard let to16 = utf16.index(from16, offsetBy: range.length, limitedBy: utf16.endIndex) else { return nil }
        guard let from = String.Index(from16, within: self) else { return nil }
        guard let to = String.Index(to16, within: self) else { return nil }
        return from ..< to
    }
    
    
    func checkVersion(_ newVersion: String) -> Bool {
        return self.compare(newVersion, options: .numeric) == .orderedAscending
    }
    
}


extension Float {
    /// 准确的小数尾截取 - 没有进位
    func decimalString() -> String {
        return String(format: "%.2f", Float(Int(self*100))/100.0)
//        return "\(Float(Int(distance*100))/100.0))"
//        let tempCount: Self = pow(10, base)
//        let temp = self*tempCount
//
//        let target = Self(Int(temp))
//        let stepone = target/tempCount
//        if stepone.truncatingRemainder(dividingBy: 1) == 0 {
//            return String(format: "%.0f", stepone)
//        }else{
//            return "\(stepone)"
//        }
    }
    func mileString() -> String {
        return String(format: "%.2f", Float(Int(self*100*0.6213))/100.0)
    }
    func footString() -> String {
        return String(format: "%.2f", Float(Int(self*100*3.281))/100.0)
    }
    func inchString() -> String {
        return String(format: "%.2f", Float(Int(self*100*39.37))/100.0)
    }
}