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阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容

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