一個(gè)實(shí)用的NSString分類工具(二) —— 獲取拼音大寫首字母和轉(zhuǎn)義等

版本記錄

版本號 時(shí)間
V1.0 2017.12.16

前言

NSString是我們經(jīng)常使用的一個(gè)類绞蹦,但是蘋果的API很多用起來不是那么方便力奋,需要根據(jù)我們特殊需求進(jìn)行個(gè)性化的改變和定制,接下來坦辟,我就寫一個(gè)NSString分類工具刊侯,以后在使用的時(shí)候直接調(diào)用這個(gè)分類中的方法,可以實(shí)現(xiàn)很多小的功能锉走,用起來也很方便滨彻。相關(guān)代碼已經(jīng)上傳至GitHub - 刀客傳奇。感興趣的可以看我上面寫的幾篇挪蹭。
1. 一個(gè)實(shí)用的NSString分類工具 (一)—— 玩轉(zhuǎn)數(shù)字

獲取拼音首字母

獲取拼音的首字母亭饵,看著簡單好像取第一個(gè)字符就可以,但是要考慮很多情況梁厉,比如說聲調(diào)正好在首位怎么辦辜羊?下面我們看一下代碼。

//獲取拼音的首字母

- (NSString *)jj_gainPinYinFirstCharacter;
//獲取拼音的首字母

- (NSString *)jj_gainPinYinFirstCharacter
{
    //轉(zhuǎn)成了可變字符串
    NSMutableString *str = [NSMutableString stringWithString:self];
    
    //先轉(zhuǎn)換為帶聲調(diào)的拼音
    CFStringTransform((CFMutableStringRef)str,NULL, kCFStringTransformMandarinLatin,NO);
    
    //再轉(zhuǎn)換為不帶聲調(diào)的拼音
    CFStringTransform((CFMutableStringRef)str,NULL, kCFStringTransformStripDiacritics,NO);
    
    //轉(zhuǎn)化為大寫拼音
    NSString *pinYin = [str capitalizedString];
    
    //獲取并返回首字母
    return [pinYin substringToIndex:1];
}

下面看一下調(diào)用

//獲取拼音首字母

- (void)gainPinYinFirstChracter
{
    NSString *str = @"womendejia";
    NSString *result = [str jj_gainPinYinFirstCharacter];
    NSLog(@"result = %@", result);
    
    NSString *str1 = @"ǎi";
    NSString *result1 = [str1 jj_gainPinYinFirstCharacter];
    NSLog(@"result1 = %@", result1);
}

看一下輸出結(jié)果

2017-12-16 09:30:47.665652+0800 JJNSStringTool[902:17277] result = W
2017-12-16 09:30:47.669444+0800 JJNSStringTool[902:17277] result1 = A

另一種計(jì)算多行字符串占有的尺寸

還是先看代碼词顾。

//獲取多行文字的寬高

- (CGSize)jj_sizeWithFont:(UIFont *)font andMaxSize:(CGSize)maxSzie;
//獲取多行文字的寬高

- (CGSize)jj_sizeWithFont:(UIFont *)font andMaxSize:(CGSize)maxSzie
{
    if (![font isKindOfClass:[UIFont class]]) {
        font = [UIFont systemFontOfSize:13];
    }
    if (NSFontAttributeName == nil || font == nil) {
        return CGSizeZero;
    }
    NSDictionary *atte = @{NSFontAttributeName : font};
    return  [self boundingRectWithSize:maxSzie options:NSStringDrawingUsesLineFragmentOrigin attributes:atte context:nil].size;
}

下面我們就看一下調(diào)用

- (void)calculateMultiLineSize
{
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(100.0, 100.0, 250, 500)];
    label.backgroundColor = [UIColor blueColor];
    label.text = @"這是什么鬼???這是什么鬼???這是什么鬼???這是什么鬼???這是什么鬼???這是什么鬼???這是什么鬼???這是什么鬼???";
    label.numberOfLines = 0;
    [label sizeToFit];
    [self.view addSubview:label];
    
    CGSize size = [label.text jj_sizeWithFont:[UIFont systemFontOfSize:20.0] andMaxSize:CGSizeMake(250, MAXFLOAT)];
    NSLog(@"%lf --- %lf", size.width, size.height);
}

看一下輸出結(jié)果

2017-12-16 09:45:28.169732+0800 JJNSStringTool[1091:27948] 242.660000 --- 143.203125

驗(yàn)證弱密碼

還是先看代碼

//密碼太弱

- (BOOL)jj_isPasswordWeak;
//密碼太弱

- (BOOL)jj_isPasswordWeak
{
    if ([self isEqualToString:@"112233"] ||
        [self isEqualToString:@"123123"] ||
        [self isEqualToString:@"123321"] ||
        [self isEqualToString:@"abcabc"] ||
        [self isEqualToString:@"abc123"] ||
        [self isEqualToString:@"a1b2c3"] ||
        [self isEqualToString:@"aaa111"] ||
        [self isEqualToString:@"123qwe"] ||
        [self isEqualToString:@"qweasd"] ||
        [self isEqualToString:@"admin"]  ||
        [self isEqualToString:@"password"] ||
        [self isEqualToString:@"p@ssword"] ||
        [self isEqualToString:@"passwd"] ||
        [self isEqualToString:@"iloveyou"] ||
        [self isEqualToString:@"5201314"]||
        [self isEqualToString:@"asdfghjkl"]||
        [self isEqualToString:@"qwerty"]) {
        return YES;
    }
    NSString *CT_NUM = @"^(0{6,16})|(1{6,16})|(2{6,16})|(3{6,16})|(4{6,16})|(5{6,16})|(6{6,16})|(7{6,16})|(8{6,16})|(9{6,16})|(a{6,16})|(b{6,16})|(c{6,16})|(d{6,16})|(e{6,16})|(f{6,16})|(g{6,16})|(h{6,16})|(i{6,16})|(j{6,16})|(k{6,16})|(l{6,16})|(m{6,16})|(n{6,16})|(o{6,16})|(p{6,16})|(q{6,16})|(r{6,16})|(s{6,16})|(t{6,16})|(u{6,16})|(v{6,16})|(w{6,16})|(x{6,16})|(y{6,16})|(z{6,16})|(A{6,16})|(B{6,16})|(C{6,16})|(D{6,16})|(E{6,16})|(F{6,16})|(G{6,16})|(H{6,16})|(I{6,16})|(J{6,16})|(K{6,16})|(L{6,16})|(M{6,16})|(N{6,16})|(O{6,16})|(P{6,16})|(Q{6,16})|(R{6,16})|(S{6,16})|(T{6,16})|(U{6,16})|(V{6,16})|(W{6,16})|(X{6,16})|(Y{6,16})|(Z{6,16})$";//
    NSPredicate *pred1 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT_NUM];
    BOOL isMatch1 = [pred1 evaluateWithObject:self];
    if (isMatch1==YES) {
        return YES;
    }
    NSString *model = @"0123456789";
    NSString *alphe = @"abcdefghijklmnopqrstuvwxyz";
    NSString *alphe2 = @"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    if ([model rangeOfString:self].location != NSNotFound) {
        return YES;
    }
    
    if ([alphe rangeOfString:self].location != NSNotFound) {
        return YES;
    }
    
    if ([alphe2 rangeOfString:self].location != NSNotFound) {
        return YES;
    }
    return NO;
}

下面我們就調(diào)用一下

//密碼太弱

- (void)evaluateWeakPassword
{
    NSString *str = @"123456";
    BOOL result = [str jj_isPasswordWeak];
    NSLog(@"result = %d", result);
    
    NSString *str1 = @"eoowehohowh";
    BOOL result1 = [str1 jj_isPasswordWeak];
    NSLog(@"result1 = %d", result1);
}

看輸出結(jié)果

2017-12-16 09:53:52.298812+0800 JJNSStringTool[1268:33541] result = 1
2017-12-16 09:53:52.300740+0800 JJNSStringTool[1268:33541] result1 = 0

URL轉(zhuǎn)義

這個(gè)大家很熟悉了八秃,但是還是給大家列了出來。還是直接看代碼肉盹。

//URL轉(zhuǎn)義

- (NSURL *)jj_encodeURL;
//URL 轉(zhuǎn)義

- (NSURL *)jj_encodeURL
{
    NSString *collectUrl = [self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    NSString *urlEncodeString = [collectUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSURL *url = [NSURL URLWithString:urlEncodeString];
    return url;
}

下面我們調(diào)用一下

// URL 轉(zhuǎn)義

- (void)encodeURL
{
    NSString *str = @"http://www.baidu.com?a=我的家";
    NSURL *result = [str jj_encodeURL];
    NSLog(@"result = %@", result);
    
    NSString *str1 = @"http://www.baidu.com?a=b";
    NSURL *result1 = [str1 jj_encodeURL];
    NSLog(@"result1 = %@", result1);
}

看一下輸出結(jié)果

2017-12-16 10:13:54.158231+0800 JJNSStringTool[1455:45285] result = http://www.baidu.com?a=%E6%88%91%E7%9A%84%E5%AE%B6
2017-12-16 10:13:54.158519+0800 JJNSStringTool[1455:45285] result1 = http://www.baidu.com?a=b

字符串的轉(zhuǎn)義

先看一下代碼

- (NSString *)jj_encodedString;
- (NSString *)jj_encodedString
{
    NSString *result = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)self, NULL, CFSTR("!*'();:@&=+$,/?%#[]"), kCFStringEncodingUTF8));
    return result;
}

下面調(diào)用一下

- (void)encodeString
{
    NSString *str = @"womendejia";
    NSString *result = [str jj_encodedString];
    NSLog(@"result = %@", result);
    
    NSString *str1 = @"ode家";
    NSString *result1 = [str1 jj_encodedString];
    NSLog(@"result1 = %@", result1);
}

下面看輸出結(jié)果

2017-12-16 10:22:32.906892+0800 JJNSStringTool[1570:49951] result = womendejia
2017-12-16 10:22:32.907132+0800 JJNSStringTool[1570:49951] result1 = ode%E5%AE%B6

字符串轉(zhuǎn)義解碼

下面我們就還原到轉(zhuǎn)義前的字符串昔驱。

- (NSString *)jj_decodedString;
- (NSString *)jj_decodedString
{
    NSString *result = CFBridgingRelease(CFURLCreateStringByReplacingPercentEscapesUsingEncoding(kCFAllocatorDefault, (CFStringRef)self, CFSTR(""), kCFStringEncodingUTF8));
    return result;
}

下面我們就調(diào)用一下

- (void)decodeString
{
    NSString *str = @"womendejia";
    NSString *result = [str jj_decodedString];
    NSLog(@"result = %@", result);
    
    NSString *str1 = @"ode%E5%AE%B6";
    NSString *result1 = [str1 jj_decodedString];
    NSLog(@"result1 = %@", result1);
}

下面看輸出結(jié)果

2017-12-16 10:34:50.994303+0800 JJNSStringTool[1726:56128] result = womendejia
2017-12-16 10:34:50.994607+0800 JJNSStringTool[1726:56128] result1 = ode家

后記

未完,待續(xù)~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末上忍,一起剝皮案震驚了整個(gè)濱河市骤肛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌窍蓝,老刑警劉巖腋颠,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異吓笙,居然都是意外死亡淑玫,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來混移,“玉大人祠墅,你說我怎么就攤上這事「杈叮” “怎么了毁嗦?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長回铛。 經(jīng)常有香客問我狗准,道長,這世上最難降的妖魔是什么茵肃? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任腔长,我火速辦了婚禮,結(jié)果婚禮上验残,老公的妹妹穿的比我還像新娘捞附。我一直安慰自己,他們只是感情好您没,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布鸟召。 她就那樣靜靜地躺著,像睡著了一般氨鹏。 火紅的嫁衣襯著肌膚如雪欧募。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天仆抵,我揣著相機(jī)與錄音跟继,去河邊找鬼。 笑死镣丑,一個(gè)胖子當(dāng)著我的面吹牛舔糖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播莺匠,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼剩盒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了慨蛙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤纪挎,失蹤者是張志新(化名)和其女友劉穎期贫,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體异袄,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡通砍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片封孙。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡迹冤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出虎忌,到底是詐尸還是另有隱情泡徙,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布膜蠢,位于F島的核電站堪藐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏挑围。R本人自食惡果不足惜礁竞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望杉辙。 院中可真熱鬧模捂,春花似錦、人聲如沸蜘矢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽硼端。三九已至并淋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間珍昨,已是汗流浹背县耽。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留镣典,地道東北人兔毙。 一個(gè)月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像兄春,于是被迫代替她去往敵國和親澎剥。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容