Swift-NSString常用扩展

//判断是否是中文

func isChinese() -> Bool {

    let match = "(^[\u{4e00}-\u{9fa5}]+$)"

    let predicate = NSPredicate(format: "SELF matches %@", match)

    return predicate.evaluate(with: self)

}

//判断手机号码格式是否正确

class func valiMobile(_ mobile: String?) -> Bool {

        // 130-139  150-153,155-159  180-189  145,147  170,171,173,176,177,178

    let phoneRegex = "^((13[0-9])|(15[^4,\\D])|(18[0-9])|(14[57])|(17[013678]))\\d{8}$"

    let phoneTest = NSPredicate(format: "SELF MATCHES %@", phoneRegex)

    return phoneTest.evaluate(with: mobile)

}

// 判断是否是数字

class func validateNumber(_ number: String?) -> Bool {

    var res = true

    let tmpSet = CharacterSet(charactersIn: "0123456789")

    let i: Int = 0

    while i < (number?.count ?? 0) {

        let string = (number as NSString?)?.substring(with: NSRange(location: i, length: 1))

        let range: NSRange? = (string as NSString?)?.rangeOfCharacter(from: tmpSet)

        if Int(range?.length ?? 0) == 0 {

            res = false

            break

        }

        i += 1

    }

    return res

}

// 判断是否为中文

class func isChinese(_ string: String?) -> Bool {

    let c = unichar(string?[string?.index(string?.startIndex, offsetBy: 0)] ?? 0)

    if c >= 0x4e00 && c <= 0x9fff {

        return true

    } else {

        return false

    }

    return true

}

//格式化电话号码 136 2222 2222

class func formatPhoneNumber(_ string: String?) -> String? {

    var str1 = string ?? ""

    str1.insert(contentsOf: " ", at: s.index(s.startIndex, offsetBy: 3))

    str1.insert(contentsOf: " ", at: s.index(s.startIndex, offsetBy: 8))

    return str1

}

//是否是一个字符

class func validateCharacter(_ string: String?) -> Bool {

    let cStr = Int8(string?.utf8CString ?? 0)

    if strlen(cStr) == 1 {

        return true

    }

    return false

}

// 判断身份证号是否正确

func judgeIdentityStringValid(_ identityString: String?) -> Bool {

    if (identityString?.count ?? 0) != 18 {

        return false

    }

        // 正则表达式判断基本 身份证号是否满足格式

    let regex2 = "^(^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$)|(^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])((\\d{4})|\\d{3}[Xx])$)$"

    let identityStringPredicate = NSPredicate(format: "SELF MATCHES %@", regex2)

    //如果通过该验证,说明身份证格式正确,但准确性还需计算

    if !identityStringPredicate.evaluate(with: identityString) {

        return false

    }

        //** 开始进行校验 *//

        //将前17位加权因子保存在数组里

    let idCardWiArray = ["7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7", "9", "10", "5", "8", "4", "2"]

        //这是除以11后,可能产生的11位余数、验证码,也保存成数组

    let idCardYArray = ["1", "0", "10", "9", "8", "7", "6", "5", "4", "3", "2"]

        //用来保存前17位各自乖以加权因子后的总和

    var idCardWiSum: Int = 0

    for i in 0..<17 {

        let subStrIndex = Int(truncating: ((identityString as NSString?)?.substring(with: NSRange(location: i, length: 1)) ?? "")) ?? 0

        let idCardWiIndex = Int(truncating: idCardWiArray[i]) ?? 0

        idCardWiSum += subStrIndex * idCardWiIndex

    }

        //计算出校验码所在数组的位置

    let idCardMod: Int = idCardWiSum % 11

        //得到最后一位身份证号码

    let idCardLast = (identityString as NSString?)?.substring(with: NSRange(location: 17, length: 1))

    //如果等于2,则说明校验码是10,身份证号码最后一位应该是X

    if idCardMod == 2 {

        if !(idCardLast == "X") || (idCardLast == "x") {

            return false

        }

    } else {

        //用计算出的验证码与最后一位身份证号码匹配,如果一致,说明通过,否则是无效的身份证号码

        if !(idCardLast == idCardYArray[idCardMod]) {

            return false

        }

    }

    return true

}

// 时间戳转时间

convenience init(fromDateString dateStr: String?) {


    let confromTimesp = Date(timeIntervalSince1970: TimeInterval(Int(truncating: dateStr ?? "") ?? 0))

    let formatter = DateFormatter()

    formatter.dateFormat = "YY-MM-dd HH:mm"

    let confromTimespStr = formatter.string(from: confromTimesp)

    return confromTimespStr

}

class func getAgeForm(_ age: Int) -> String? {

    let mouthArr = ["0个月", "1个月", "2个月", "3个月", "4个月", "5个月", "6个月", "7个月", "8个月", "9个月", "10个月", "11个月", "12个月"]

    let yearArr = ["0岁", "1岁", "2岁", "3岁", "4岁", "5岁", "6岁", "7岁"]

    let mouthIndex: Int = age % 12

    let yearIndex: Int = age / 12

    let mouth = mouthArr[mouthIndex]

    let year = yearArr[yearIndex]

    var ageText: String

    if age < 12 {

        ageText = "\(mouth)"

    } else if age == 12 {

        ageText = "1岁"

    } else {

        ageText = "\(year)\(mouth)"

    }

    return ageText

}

class func cachePathWithfileName(_ filename: String?) -> String? {

    return URL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).last ?? "").appendingPathComponent("\(filename ?? "").plist").absoluteString

}

// 根据订单创建时间获得订单的倒计时数

class func getRemainTime(with closeTime: String?) -> Int {

    var closeTime = closeTime

    let date = Date()

        // 当前时间

        //    NSDateFormatter *formate = [[NSDateFormatter alloc] init];

        //    formate.dateFormat = @"YYMMddHHmmss";

        //    NSString *formatDate = [formate stringFromDate:date];

    let timeSp = String(format: "%.0f", date.timeIntervalSince1970)

    // 时间差 剩余时间 关闭时间-当前时间

    if (closeTime?.count ?? 0) > 10 {

        closeTime = (closeTime as NSString?)?.substring(with: NSRange(location: 0, length: 10))

    }

    let timeLast = Int(truncating: closeTime ?? "") ?? 0 - Int(truncating: timeSp) ?? 0

    return timeLast

}

// 得到当前的时间戳

class func getCurrentTime() -> String? {

    let formatter = DateFormatter()

    formatter.dateStyle = .medium

    formatter.timeStyle = .short

    formatter.dateFormat = "YYYY-MM-dd HH:mm:ss SSS"

        // ----------设置你想要的格式,hh与HH的区别:分别表示12小时制,24小时制

        //设置时区,这个对于时间的处理有时很重要

    let timeZone = NSTimeZone(name: "Asia/Shanghai")

    if let aZone = timeZone {

        formatter.timeZone = aZone as TimeZone

    }

    let datenow = Date()

        //现在时间,你可以输出来看下是什么格式

    let timeSp = "\(Int(datenow.timeIntervalSince1970) * 1000)"

    return timeSp

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • SwiftDay011.MySwiftimport UIKitprintln("Hello Swift!")var...
    smile丽语阅读 3,826评论 0 6
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,727评论 2 9
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,727评论 0 38
  • 去年五一我回老家和刚从美国回来的大伯母聊了很久。 妈妈问大伯母:学了几句英语啊,赶明也带上我? 伯母说:就学会了一...
    时小时阅读 309评论 0 1