2015-05-26 20:18:50 ndscoahz 阅读数 5965

最近写代码需要根据不同的内容显示不同的颜色。在这里mark一下。

设置颜色:

 NSString *contentStr = @"简介:hello world";
 NSMutableAttributedString *str = [[NSMutableAttributedString alloc]initWithString:contentStr];
 //设置:在0-3个单位长度内的内容显示成红色
 [str addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0, 3)];
 label.attributedText = str;

实现效果:



现在的项目有这么一个效果要实现:


如果所示,需要让数字显示成红色。问题是,有时候数字是2位数或者更多,给自己mark了一个方法:


2016-09-08 14:37:40 zwl492454828 阅读数 1611


例如 

1、

NSString *value = @"123AAAAAAA";

[value compare:@"123AAAAAAA"],返回 NSOrderedSame。


2、不区分大小写

NSString *returnstr = @"aaaaaaaa";

NSString *compare:MACstring = @"aAaAaaaa";

int result =[returnstr compare:MACstring options:NSCaseInsensitiveSearch| =NSNumericSearch];

返回结果:result == 0;

typedef NS_ENUM(NSInteger, NSComparisonResult)

 {NSOrderedAscending = -1L, 

  NSOrderedSame, 

  NSOrderedDescending

};


options:(NSStringCompareOptions)

传入 NSStringCompareOptions 枚举的值

typedef NS_OPTIONS(NSUInteger, NSStringCompareOptions) {

   

   NSCaseInsensitiveSearch = 1,//不区分大小写比较

    NSLiteralSearch = 2,//区分大小写比较

    NSBackwardsSearch = 4,//从字符串末尾开始搜索

    NSAnchoredSearch = 8,//搜索限制范围的字符串

    NSNumbericSearch = 64//按照字符串里的数字为依据,算出顺序。例如 11aas2fgdfg < 11aas3fgdfg < 11aas8fgdfg

//以下定义高于 mac os 10.5 或者高于 iphone 2.0 可用

    ,

    NSDiacriticInsensitiveSearch = 128,//忽略 "-" 符号的比较

    NSWidthInsensitiveSearch = 256,//忽略字符串的长度,比较出结果

    NSForcedOrderingSearch = 512//忽略不区分大小写比较的选项,并强制返回 NSOrderedAscending 或者 NSOrderedDescending

//以下定义高于 iphone 3.2 可用

    ,

    NSRegularExpressionSearch = 1024//只能应用于 rangeOfString:..., stringByReplacingOccurrencesOfString:...和 replaceOccurrencesOfString:... 方法。使用通用兼容的比较方法,如果设置此项,可以去掉 NSCaseInsensitiveSearch 和 NSAnchoredSearch

};

比较的方法:

[value compare:(NSString *)];

[value compare:(NSString *) options:(NSStringCompareOptions)];

[value compare:(NSString *) options:(NSStringCompareOptions) range:(NSRange)];

传入一个需要比较的字符串。



2018-01-16 11:43:40 jxy_fighting 阅读数 1575

原则:一个中文字符占用2个unicode,一个英文字符占用1个unicode,一个emoji表情占用4个unicode,“\n”占用1个unicode

使用[NSString length]获取到的是一个中文字符是1,一个英文字符也是1,因此此种计算方法不适合定制中英文混合字符串长度的规则;

建议和产品沟通一番,采用unicode的个数来计算字符串长度,例如:一个英文字符算0.5的长度,一个中文字符算1的长度

以下方法是计算字符串unicode个数的计算方法(OC)

    int strlength = 0;

    char* p = (char*)[testStringcStringUsingEncoding:NSUnicodeStringEncoding];

    for (int i=0 ; i<[testString lengthOfBytesUsingEncoding:NSUnicodeStringEncoding] ;i++) {

        if (*p) {

            p++;

            strlength++;

        }

        else {

            p++;

        }

    }

    NSLog(@"%ld",strlength);

或者是用下面的方法

    NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);

    NSData* da = [testString dataUsingEncoding:enc];

    NSUInteger lengthTest = [da length];


2015-07-07 11:20:21 woshidaniu 阅读数 4083

//

//  ViewController.m

//  tableview复习

//

//  Created by tianshangrenjian on 15/7/7.

//  Copyright © 2015 tianshangrenjian. All rights reserved.

//


#import "ViewController.h"


@interface ViewController ()

@property (weak, nonatomic) IBOutlet UILabel *lbInfo;

@property (weak, nonatomic) IBOutlet UIView *viewInfo;


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    

}

- (void)touchesBegan:(nonnull NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event

{

    NSString *str=@"   开源界总是有许多有趣的东东,这三个合起来就是一个完整的XMPP IM 实现。包括服务器端——Openfire,,XMPP 传输协议的实现——Smack(记住,XMPP是一个协议,协议是需要实现的,Smack起到的就是这样的一个作用)。三者都是基于Java 语言的实现。";

    CGSize size=CGSizeMake(270, MAXFLOAT);

    UIFont *font=[UIFont systemFontOfSize:18];

    NSDictionary *attrs=@{NSFontAttributeName:font};

    

    CGSize s=[str boundingRectWithSize:size options:NSStringDrawingTruncatesLastVisibleLine |

              NSStringDrawingUsesLineFragmentOrigin |

              NSStringDrawingUsesFontLeading attributes:attrs context:nil].size;

    CGSize s1=[str sizeWithAttributes:attrs];

    NSLog(@"%g   %g",s.height,s.width);

    NSLog(@"s1 :%g   %g",s1.height,s1.width);

    

    self.viewInfo.frame=CGRectMake(0 , 0, s.width+20, s.height+38);

    [self.viewInfo setNeedsDisplay];

    self.lbInfo.frame=CGRectMake(15,5, 270, s.height);

    self.lbInfo.lineBreakMode=NSLineBreakByWordWrapping;

    self.lbInfo.font=font;

    self.lbInfo.numberOfLines=0;

    self.lbInfo.text=str;


}

- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}


@end

2009-12-23 17:59:00 maomaokuaile 阅读数 27431

一 字符串转数字

1.CRT函数  (需要的头文件 <stdlib.h> <math.h> <wchar.h>)

  ASCII UNICODE TCHAR VS2005
int atoi _wtoi _tstoi
_ttoi
_atoi_l
_wtoi_l
long atol _wtol _tstoi
_ttoi
_atoi_l
_wtoi_l
__int64 _atoi64 _wtoi64 _tstoi64
_ttoi64
_atoi64_l
_wtoi64_l
float       _atoflt
_atoflt_l
double atof _wtof _tstof
_ttof
_atof_l
_wtof_l
_atodbl
_atodbl_l
long double       _atoldbl
_atoldbl_l

2.使用sscanf  头文件<stdio.h>

sscanf()  从一个字符串中读进与指定格式相符的数据。

原型:

int sscanf( const char *buffer,const char *format [,argument ] ... );
int scanf(const char *format [,argument]... );

其中参数 buffer:输入存储的数据;format:格式控制字符串

sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。

例:(msdn里的例子)

#include <stdio.h>

int main( void )
{
   char  tokenstring[] = "15 12 14...";
   char  s[81];
   char  c;
   int   i;
   float fp;

   // Input various data from tokenstring:
   // max 80 character string:
   sscanf( tokenstring, "%80s", s ); // C4996
   sscanf( tokenstring, "%c", &c );  // C4996
   sscanf( tokenstring, "%d", &i );  // C4996 将字符串转化为整数
   sscanf( tokenstring, "%f", &fp ); // C4996 将字符串转化为浮点数
   // Note: sscanf is deprecated; consider using sscanf_s instead

   // Output the data read
   printf( "String    = %s/n", s );
   printf( "Character = %c/n", c );
   printf( "Integer:  = %d/n", i );
   printf( "Real:     = %f/n", fp );
}
输出结果:
String    = 15
Character = 1
Integer:  = 15
Real:     = 15.000000
其实sscanf很强大,功能类似于正则表达式,可以用于比较复杂的字符串处理。当只是单纯的将字符串转化为整数建议用第一种方法。
参考 http://baike.baidu.com/view/1364018.htm

3.Windows SDK:StrToInt

头文件 <shlwapi.h> 

导入库 shlwapi.lib

 

二 数字转字符串

1.CRT函数

  ASCII UNICODE TCHAR VS2005
int itoa
_itoa
_itow _itot  
long ltoa
_ltoa
_ltow _ltot  
__int64 _i64toa _i64tow _i64tot  
double gcvt
_gcvt
_ecvt
_fcvt
_wtof
_tstof
_ttof
_gcvt_s
_ecvt_s
_fcvt_s

2.使用sprintf   头文件<stdio.h>

原型:int sprintf(char *buffer,const char *format [,argument] ... );
将字符串格式化,buffer 格式化输出的字符串;format格式控制字符串;返回字符串长度。

例:(msdn例子)

// crt_sprintf.c
// compile with: /W3
// This program uses sprintf to format various
// data and place them in the string named buffer.

#include <stdio.h>

int main( void )
{
   char  buffer[200], s[] = "computer", c = 'l';
   int   i = 35, j;
   float fp = 1.7320534f;

   // Format and print various data: 
   j  = sprintf( buffer,     "   String:    %s/n", s ); // C4996
   j += sprintf( buffer + j, "   Character: %c/n", c ); // C4996
   j += sprintf( buffer + j, "   Integer:   %d/n", i ); // C4996 整数转化为字符串
   j += sprintf( buffer + j, "   Real:      %f/n", fp );// C4996 浮点数转化为字符串
   // Note: sprintf is deprecated; consider using sprintf_s instead

   printf( "Output:/n%s/ncharacter count = %d/n", buffer, j );
}
输出:
   String:    computer
   Character: l
   Integer:   35
   Real:      1.732053

character count = 79

3.<strsafe.h>:StringCbPrintf

4.MFC/ATL:

CString::Format

例:

CString str;
str.Format(_T("Floating point: %.2f/n"), 12345.12345);
_tprintf("%s", (LPCTSTR) str);
输出:Floating point: 12345.12

三 补充:

1 函数原型

字符串转int

int atoi(const char *string);
_int64 _atoi64(const char *string);
int _wtoi(const wchar_t *string);
_int64 _ wtoi64(const char *string);

字符串转long

long atol(const char * string);
long _wtol(const wchar_t *string);

字符串转double

double atof(const char *string);
double _wtof(const wchar_t *string);

int转字符串

cahr *_itoa( int value,char *string,int radix);
char *_i64toa(_int64 value,char *string,int radix);
char * _ui64toa(unsigned _int64 value,char *string, int radix);
wchar_t * _itow(int value,wchar_t *string, int radix);
wchar_t * _i64tow(_int64 value,wchar_t *string, int radix);
wchar_t * _ui64tow(unsigned _int64 value,wchar_t *string, int radix);
参数的意义:value 是指要转换的整数,sring 是用来存放转换后结果的便利,radix是用来说明转换成几进制的数据,默认值是十进制数的。转换的进制范围是二进制到三十六进制。

long转字符串

char *_ltoa( long value,char *string, int radix );
wchar_t *_ltow( long value, wchar_t *string, int radix );
其中,参数 value 为被转换的值,参数string为字符串缓冲区,radix为进制。

double转字符串

char *_fcvt( double value, int count, int *dec, int *sign );
其中参数value 为双精度数,参数count为转换的小数点后面的位数,dec表示小数点的位置, sign 表示符号。

2 float与double的区别

单精度浮点数在机内占4个字节,用32位二进制描述。
双精度浮点数在机内占8个字节,用64位二进制描述。
浮点数在机内用指数型式表示,分解为:数符,尾数,指数符,指数四部分。
数符占1位二进制,表示数的正负。
指数符占1位二进制,表示指数的正负。
尾数表示浮点数有效数字,0.xxxxxxx,但不存开头的0和点
指数存指数的有效数字。
指数占多少位,尾数占多少位,由计算机系统决定。
可能是数符加尾数占24位,指数符加指数占8位 -- float.
数符加尾数占48位,指数符加指数占16位 -- double.
知道了这四部分的占位,按二进制估计大小范围,再换算为十进制,就是你想知道的数值范围。
对编程人员来说,double 和 float 的区别是double精度高,有效数字16位,float精度7位。但double消耗内存是float的两倍,double的运算速度比float慢得多,C语言中数学函数名称double 和 float不同,不要写错,能用单精度时不要用双精度(以省内存,加快运算速度)。

参考:

1 http://hi.baidu.com/csw8923/blog/item/dbfdbb13ed5af80a5baf530d.html/cmtid/dfc153124261f25bf919b858

2 http://msdn.microsoft.com/en-us/library/5948ysye%28VS.80%29.aspx

计算字符串的长度

阅读数 522

没有更多推荐了,返回首页