银行卡号分割输入

1. 创建两个全局变量  遵守UITextField 的代理

NSString    *_previousTextFieldContent;

UITextRange *_previousSelection;

2.给输入银行卡号的textField 添加事件  设置代理

    _bankCardNumTextField.delegate=self

      [_bankCardNumTextField addTarget:self action:@selector(reformatAsBankCardNumber:) forControlEvents:UIControlEventEditingChanged];

3.在你的.m文件里粘贴上下面代码

#pragma mark - 重新格式化银行卡号

-(void)reformatAsBankCardNumber:(UITextField *)textField

{

//       判断正确的光标位置

NSUInteger targetCursorPostion = [textField offsetFromPosition:textField.beginningOfDocument toPosition:textField.selectedTextRange.start];

// 没有插入空格的银行卡号

NSString *bankCardNumberWithoutSpaces = [self removeNonDigits:textField.text andPreserveCursorPosition:&targetCursorPostion];

//    避免超过19位的输入

if(bankCardNumberWithoutSpaces.length > 19) {

[textField setText:_previousTextFieldContent];

textField.selectedTextRange = _previousSelection;

return;

}

//获取插入空格后的银行卡号

NSString *bankCardNumberWithSpaces = [self insertSpacesEveryFourDigitsIntoString:bankCardNumberWithoutSpaces andPreserveCursorPosition:&targetCursorPostion];

textField.text = bankCardNumberWithSpaces;

UITextPosition *targetPostion = [textField positionFromPosition:textField.beginningOfDocument offset:targetCursorPostion];

[textField setSelectedTextRange:[textField textRangeFromPosition:targetPostion toPosition:targetPostion]];

}

#pragma mark -  除去非数字字符(空格),确定光标正确位置

// string:当前的string  cursorPosition:光标位置  return 处理过后的string

- (NSString *)removeNonDigits:(NSString *)string andPreserveCursorPosition:(NSUInteger *)cursorPosition

{

NSUInteger originalCursorPosition =*cursorPosition;

NSMutableString *digitsOnlyString = [NSMutableString new];

for (NSUInteger i=0; i<string.length; i++) {

unichar characterToAdd = [string characterAtIndex:i];

if(isdigit(characterToAdd)) {

NSString *stringToAdd = [NSString stringWithCharacters:&characterToAdd length:1];

[digitsOnlyString appendString:stringToAdd];

}

else {

if(i<originalCursorPosition) {

(*cursorPosition)--;

}

}

}

return digitsOnlyString;

}

#pragma mark -  将空格插入我们现在的string 中,并确定光标的正确位置,防止在空格中出现问题

//string:当前的string cursorPosition:光标位置 return:处理后有空格的string

- (NSString *)insertSpacesEveryFourDigitsIntoString:(NSString *)string andPreserveCursorPosition:(NSUInteger *)cursorPosition

{

NSMutableString *stringWithAddedSpaces = [NSMutableString new];

NSUInteger cursorPositionInSpacelessString = *cursorPosition;

for (NSUInteger i=0; i<string.length; i++) {

if ( i > 0 )

{

if(i%4 == 0) {

[stringWithAddedSpaces appendString:@" "];

if(i < cursorPositionInSpacelessString) {

(*cursorPosition)++;

}

}

}

unichar characterToAdd = [string characterAtIndex:i];

NSString *stringToAdd = [NSString stringWithCharacters:&characterToAdd length:1];

[stringWithAddedSpaces appendString:stringToAdd];

}

return stringWithAddedSpaces;

}

#pragma mark - UITextFieldDelegate

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

{

_previousSelection = textField.selectedTextRange;

_previousTextFieldContent = textField.text;

return YES;

}

时间: 2024-10-13 11:40:22

银行卡号分割输入的相关文章

JS中同步显示并分割输入的数字字符串

题目比较晦涩,来张图来说明要表达的效果: 第一张图的效果就是,用户输入一个数字,上面就显示一个大层,然后显示输入的数字,并把数字用空格按照每四位分割出来.好像在建行的网上银行上面就有这种效果.第二个图的效果就是用户在一个文本框中输入一串数字,然后再光标离开的时候,把数字按照每三位用逗号给分割开来,类似于老外的金钱输入效果. 效果一 同步显示分割分割输入 这种效果中,仿造的就是输入银行卡子类的,故只能够输入数字,需要禁用用户输入的其它字符下面是几种实现方式.先贴上HTML和CSS代码: 1 <ht

JS校验银行卡号、输入卡号时放大效果

一.(校验格式) function CheckBankNo(t_bankno) { var bankno = $.trim(t_bankno); if(bankno == "") { layer.msg("请填写银行卡号"); return false; } if(bankno.length < 16 || bankno.length > 19) { layer.msg("银行卡号长度必须在16到19之间"); return fals

实现EditText的分割输入内容效果

 package com.example.sequencenumber; import android.content.Context; import android.content.res.TypedArray; import android.text.Editable; import android.text.TextWatcher; import android.util.AttributeSet; import android.view.View; import android.widg

C语言基础--常用的数据输入输出函数

常用的数据输入输出函数 以下只是个人学习的笔记,由于我也是刚接触,所以有可能有错误,如有错误,请指出 1.语句 语句:就是完成一定的操作任务,在编写程序时,生命部分不能算作语句,如,int a=10:   程序中包括声明部分和执行部分,其中执行部分即由语句组成 2.字符数据输入输出 (1).字符数据输出 字符数据输出使用的是putchar,其作用是向显示设备输出一个字符,其语法格式是int putchar(int ch);,其中的ch是要进行输出的字符可以是字符型变量或者整型变量,也可以是常量,

阈值分割之迭代选择阈值法

function [Ibw, thres] = autoThreshold(I) % 迭代法自动阈值分割 % % 输入:I - 要进行自动阈值分割的灰度图像 % 输出:Ibw - 分割后的二值图像 % thres - 自动分割采用的阈值 thres = 0.5 * (double(min(I(:))) + double(max(I(:)))); %初始阈值 done = false; %结束标志 while ~done g = I >= thres; Tnext = 0.5 * (mean(I(

文件分割与合并(Java)

一.文件分割示意图 二.文件合并示意图 方式一:通过文件追加的方式 方式二:通过SequenceInputStream对其他输入流的逻辑串联. 测试RandomAccessFile随机访问文件 package FileSplitMerge; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import IOOthers.FileUtil; /** * RandomAccessFil

基于jquery的邮箱输入联想插件开发

js代码: /*create by code_bunny 20140701 [email protected] https://github.com/OOP-Code-Bunny */ (function ($) { $.fn.autoComplate = function (opts) { this.each(function () { init.call(this, opts); }); return this; }; function init(opts) { var defaultOpt

PCL—点云分割(最小割算法)

1.点云分割的精度 在之前的两个章节里介绍了基于采样一致的点云分割和基于临近搜索的点云分割算法.基于采样一致的点云分割算法显然是意识流的,它只能割出大概的点云(可能是杯子的一部分,但杯把儿肯定没分割出来).基于欧式算法的点云分割面对有牵连的点云就无力了(比如风筝和人,在不用三维形态学去掉中间的线之前,是无法分割风筝和人的).基于法线等信息的区域生长算法则对平面更有效,没法靠它来分割桌上的碗和杯子.也就是说,上述算法更关注能不能分割,除此之外,我们还需要一个方法来解决分割的"好不好"这个

在项目中常用的JS方法封装

使用方法简单,只需要放在你的 utils.js 工具文件中,直接export const 加上下面封装方法,在别的文件中使用 {方法1,方法2,方法3...}引用后直接使用即可. 01.输入一个值.返回其数据类型 type = para =>{ return Object.toString.call(para).slice(8,-1) } 02.冒泡排序 升序 bubbleAsSort() bubbleAsSort = arr =>{ for(let i=0;i<arr.length -