iOS textfield限制长度,中文占2字符,英文占1字符
之前遇到一种情况,限制textfield长度,并且要适配多语言,做到,例如中文占2字符,英文占1字符,还有考虑其他语言,网上找了很多方法,不太合适,最后结合网上的方案,修改出了还比较适用。
首先,增加对textfield文字改变的监听,
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(textFiledEditChanged:) name:UITextFieldTextDidChangeNotification object:nil];//修改用户名监听,以改变修改按钮的位置
需要记得在最后要移除监听!
[[NSNotificationCenter defaultCenter] removeObserver:self name:UITextFieldTextDidChangeNotification object:nil];
这里写的监听方法是textFiledEditChanged: 文字改变就会调用该方法,思路就是限制长度,超出就截断字符串,所以要考虑的问题是:1、什么时候超出长度?2、在哪截断。还有一个问题就是,在用拼音输入中文的时候,拼音字母还没转换为中文,但是也会引起变化并调用这个方法,如果在这个方法里面获取textfield的文字,会获取到中文和还没转中文的字母和自动加的空格...所以这个问题需要处理,不然会造成例如最多能输入5个中文(10个英文字母),当你输入了4个中文后,你后面只能输入两个字母来拼出一个中文,这是不合理的。解决方法是不统计这些还未转换到字母,(注:还未转换称之为高亮状态)。
下面解决这些问题:首先,区分中英文的长度(同样适用于多语言),思路是能转ascii码的和不能转的分开统计,那么就要遍历字符串,分开一个一个字符,在遍历的时候可以同时确定要截取字符串的位置,代码如下:
- (CGFloat)countW:(NSString *)s
{
int i;CGFloat n=[s length],l=0,a=0,b=0;
CGFloat wLen=0;
unichar c;
for(i=0;i<n;i++){
c=[s characterAtIndex:i];//按顺序取出单个字符
if(isblank(c)){//判断字符串为空或为空格
b++;
}else if(isascii(c)){
a++;
}else{
l++;
}
wLen=l+(CGFloat)((CGFloat)(a+b)/2.0);
NSLog(@"wLen--%f",wLen);
if (wLen>=4.5&&wLen<5.5) {//设定这个范围是因为,当输入了当输入9英文,即4.5,后面还能输1字母,但不能输1中文
_subLen=l+a+b;//_subLen是要截取字符串的位置
} }
if(a==0 && l==0)
{
_subLen=0;
return 0;//只有isblank
}
else{ return wLen;//长度,中文占1,英文等能转ascii的占0.5
}
}
监听方法如下:
-(void)textFiledEditChanged:(NSNotification *)obj{
@try{
UITextField *textField = _userNameTf;
NSString *str = [[textField text] stringByReplacingOccurrencesOfString:@"?" withString:@""];//输入的字符,包括键盘上高亮的未转成中文的拼音
NSLog(@"str--%@",str);
UITextRange *selectedRange = [textField markedTextRange];
UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];//高亮
if (!position) {//没高亮的文字
CGFloat ascLen=[self countW:str];//没高亮,获取长度
NSLog(@"ascLen------------------%f",ascLen);
if (ascLen > 5) {
NSString *strNew = [NSString stringWithString:str];
NSLog(@"strNew--%@",strNew);
NSLog(@"_subLen%f",_subLen);
if (_subLen==0) {
_subLen=strNew.length;
}
[textField setText:[strNew substringToIndex:_subLen]];
}
}
else{
// NSLog(@"输入的英文还没转化为汉字");//只是高亮,不应该算长度
}
}
@catch(NSException *exception) {
NSLog(@"exception:%@", exception);
}
@finally {
}
}
iOS textfield限制长度,中文占2字符,英文占1字符的更多相关文章
- js 字符截取 汉字2字符 英文1个字符
function countCharacters(str, num) { var str = '' + str || '', num = +num || 0, res = '', length = 0 ...
- JS判断字符串长度(英文占1个字符,中文汉字占2个字符)
//计算字符串长度(英文占1个字符,中文汉字占2个字符) 方法一: String.prototype.gblen = function() { var len = 0; for (var i=0; i ...
- JS判断字符串长度,结合element el-input el-form 表单验证(英文占1个字符,中文汉字占2个字符)
首先看看判断字符串长度的几种方法(英文占1个字符,中文汉字占2个字符) 方法一: function strlen(str) { var len = 0; for (var i = 0; i < ...
- iOS 限制TextField输入长度(标准)
iOS 限制TextField输入长度(标准) 网上有很多限制textField输入长度方法,但是我觉得都不是很完美,准确来说可以说是不符合实际开发的要求,因此在这里整理一下textField限制输入 ...
- python中文utf8编码后是占3个字符,unicode汉字为2字节
一个中文utf8编码后是占3个字符,所以求长度的函数可以这样写 def str_len(str): try: row_l=len(str) utf8_l=len(str.encode('utf-8') ...
- Java中文字符所占的字节数
Java语言中,中文字符所占的字节数取决于字符的编码方式,一般情况下,采用ISO8859-1编码方式时,一个中文字符与一个英文字符一样只占1个字节:采用GB2312或GBK编码方式时,一个中文字符占2 ...
- iOS textfield 限制输入字数长度
iOS textfield限制输入的最大长度 [self.textFiled addTarget:self action:@selector(textFieldDidChange:) forContr ...
- varchar(n),nvarchar(n) 长度、性能、及所占空间的说明
varchar(n),nvarchar(n) 中的n怎么解释: nvarchar(n)最多能存n个字符,不区分中英文. varchar(n)最多能存n个字节,一个中文是两个字节. 所占空间: nvar ...
- [转]varchar(n),nvarchar(n) 长度、性能、及所占空间分析
varchar(n),nvarchar(n) 中的n怎么解释: nvarchar(n)最多能存n个字符,不区分中英文. varchar(n)最多能存n个字节,一个中文是两个字节. 所占空间: nvar ...
随机推荐
- 监控工具cacti
一. 安装 cacti服务端 1. 首先要安装epel扩展源yum install -y epel-release2. (lamp)然后分别安装httpd.php.mysqlyum install - ...
- 对arm指令集的疑惑,静态库运行,编译报错等问题
转载自http://www.jianshu.com/p/4a70aa03a4ea?utm_campaign=hugo&utm_medium=reader_share&utm_conte ...
- lnmp、lamp、lnmpa一键安装包(Updated: 2015-10-25)
lnmp.lamp.lnmpa一键安装包(Updated: 2015-10-25) 2014-12-26 Posted by yeho 这个脚本是使用shell编写,为了快速在生产环境上部署lnmp/ ...
- window.onload,<body onload="function()">, document.onreadystatechange, httpRequest.onreadystatechang
部分内容参考:http://www.aspbc.com/tech/showtech.asp?id=1256 在开发的过程中,经常使用window.onload和body onload两种,很少使用do ...
- C# txt文件读写
//读取文件内容 (1).使用FileStream类进行文件的读取,并将它转换成char数组,然后输出. ]; ]; public void Read() { try { FileStream fil ...
- 图文-水平垂直居中兼容ie6+
图文-水平垂直居中兼容ie6+ 具体代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8&q ...
- 数值运算内建函数(core python programming 2nd edition 5.6.2)
数值运算内建函数 函数 功能 abs(num) 返回 num 的绝对值 coerce(num1, num2) 将num1和num2转换为同一类型,然后以一个元组的形式返回. divmod(num1, ...
- 深入理解 静态类和静态字段(C# 基础)
序言 以前,总是被提醒,在编程过程中尽量少用静态变量,数据丢失什么的,今天有空,禁不住对静态变量的强烈好奇,跟我一起了解下静态家族的内幕吧. 静态类 定义 静态类与非静态类的重要区别在于静态类不能实例 ...
- Python 购物车---之商家部分
知识点:文件写入操作, 函数, 函数递归 #!C:\Program Files\Python35/bin # -*- conding:utf-8 -*- # author: Frank # 定义商品列 ...
- 必须得是一万小时的 刻意训练(deliberate practice)
成功素质1:一万小时与格物致知 “格物致知14”的概念,我是从张银奎11老师那里了解到的.它的意思是“推究事物的原理,从而获得知识”,跟我在<透过现象看本质 - 写在观看WWDC 2016 Ke ...