银行卡格式化输出及后四位显示

#import <UIKit/UIKit.h>

@interface BankCardFormat : UITextField

@end
#import "BankCardFormat.h"

@interface BankCardFormat ()<UITextFieldDelegate>
{
    NSString *previousTextFieldContent;

    UITextRange *previousSelection;
}
@end

@implementation BankCardFormat

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];

    if (self) {
        self.delegate = self;

        [self addTarget:self

       action          :@selector(reformatAsCardNumber:)

       forControlEvents:UIControlEventEditingChanged];
    }

    return self;
}

- (void)reformatAsCardNumber:(UITextField *)textField
{

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

    NSString *cardNumberWithoutSpaces =[self removeNonDigits:textField.text andPreserveCursorPosition:&targetCursorPosition];

    if ([cardNumberWithoutSpaces length] > 19) {
        [textField setText:previousTextFieldContent];
        textField.selectedTextRange = previousSelection;
        return;
    }

    NSString *cardNumberWithSpaces =[self insertSpacesEveryFourDigitsIntoString:cardNumberWithoutSpaces
                                                      andPreserveCursorPosition:&targetCursorPosition];

    textField.text = cardNumberWithSpaces;
    UITextPosition *targetPosition =[textField positionFromPosition:[textField beginningOfDocument]offset:targetCursorPosition];

    [textField setSelectedTextRange:[textField textRangeFromPosition:targetPosition toPosition:targetPosition]];
}

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    previousTextFieldContent = textField.text;
    previousSelection = textField.selectedTextRange;

    return YES;
}
- (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;
}
- (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) && ((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;
}

@end
//银行卡号输入的时候要求四位一个空格
/*使用方法:

 BankCardFormat *bankCardNumber = [[BankCardFormat alloc]initWithFrame:CGRectMake(60, 122, 230, 50)];
 bankCardNumber.borderStyle = UITextBorderStyleLine;
 bankCardNumber.placeholder = @"请输入你的银行卡号";
 [self.view addSubview:bankCardNumber];

 */

//银行卡只显示后四位的做法
/*
 原始卡号
NSString * origincardNo = [_wedData  objectAtIndex:i][@"bankCardNo"];

NSString *firstCardNo = [origincardNo  substringToIndex:origincardNo.length-4];
DLog(@"")
//        后四位数字
NSString *lastfourCardno = [origincardNo  substringFromIndex:origincardNo.length - 4];
DLog(@"%@",lastfourCardno);

DLog("%lu",(unsigned long)origincardNo.length);

DLog("%lu",(unsigned long)firstCardNo.length);

NSString *replacecardNo = [firstCardNo  stringByReplacingOccurrencesOfString:firstCardNo withString:@"*****************************"];

DLog("%lu",(unsigned long)replacecardNo.length);

NSString *transform;

if (replacecardNo.length>firstCardNo.length) {

    transform = [replacecardNo  substringToIndex:firstCardNo.length];
}

DLog("%lu",(unsigned long)transform.length);

DLog("%@",replacecardNo);

NSString *cardNumberstr = [NSString stringWithFormat:@"%@%@",transform,lastfourCardno];

NSString *tmpStr = cardNumberstr;

DLog("%@",cardNumberstr);

DLog("%@",tmpStr);

int size = (int)tmpStr.length / 4;
NSMutableArray *tmpStrArr = [[NSMutableArray alloc] init];
for (int n = 0;n < size; n++)
{
    [tmpStrArr addObject:[tmpStr substringWithRange:NSMakeRange(n*4, 4)]];
}
[tmpStrArr addObject:[tmpStr substringWithRange:NSMakeRange(size*4, (tmpStr.length % 4))]];
tmpStr = [tmpStrArr componentsJoinedByString:@" "];

DLog("%lu",(unsigned long)tmpStr.length);
DLog("%@",tmpStr);

//tmpStr就是最终只显示后四位的的银行卡号
 */
时间: 2024-12-06 20:03:27

银行卡格式化输出及后四位显示的相关文章

002_python的in,while else,格式化输出,逻辑运算符,int与bool转换,编码

数据 1.什么是数据? x=10,10是我们要存储的数据 2.为何数据要分不同的类型 数据是用来表示状态的,不同的状态就应该用不同的类型的数据去表示 3.数据类型 数字 字符串 列表 元组 字典 集合 数据类型 1.数字int 数字主要是用于计算用的,使用方法并不是很多,就记住一种就可以:#bit_length() 当十进制用二进制表示时,最少使用的位数 v = 11 data = v.bit_length() print(data) 2.布尔值bool 布尔值就两种:True,False.就是

var_dump() 格式化输出 | 显示不全

PHP 使用‘var_dump($var)’时 没有格式化输出,显得乱糟糟的.原因是没有启用‘XDebug’扩展 [php.ini] ; XDEBUG Extension zend_extension = "x:/wamp/bin/php/php5.5.12/zend_ext/php_xdebug-2.2.5-5.5-vc11.dll" var_dump()方法输出时候会展示不全出现省略号 解决下 在php.ini里的[xdebug]节点中,追加一下配置: xdebug.var_dis

Python自动化运维之7、格式化输出、生成器、迭代器、列表解析、迭代器表达式

Python格式化输出: Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] (1)百分号格式化 %[(name)][flags][width][.precision]typecode .... (name) 可选,用于选择指定的key flags 可选,可供选择的值有: + 右对齐:正数前加正好,负数前加负号: - 左对齐:正数前无符号,负数前加负号: 空

python格式化输出及大量案例

python格式化输出符号及大量案例 1.格式化输出符号 python格式化输出符号 格式化符号 含义 %c 转化成字符 %r 优先使用repr()函数进行字符串转化 %s 转换成字符串,优先使用str() %d或%i 转化成有符号十进制 %u 转化成无符号十进制 %o 转化成无符号八进制数 %x或%X 转化成无符号十六进制数,x或X代表转化后以小写或者大写形式输出 %e或%E 转化成科学计数法,e或E代表以小写或者大写形式输出 %f或%F 转化成浮点数 %g或%G %e和%f 或 %E和%F的

perl5 第十章 格式化输出

第十章 格式化输出 by flamephoenix 一.定义打印格式二.显示打印格式三.在打印格式中显示值  1.通用的打印格式  2.格式和局域变量  3.选择值域格式  4.输出值域字符四.输出到其它文件五.分页六.格式化长字符串七.用printf格式化输出 我们已经见过用print函数将原始的未格式化的文本输出到文件,本章讲述如何用函数write和打印格式来生成格式化的输出.二.显示打印格式    打印格式的显示有两步:     1.将系统变量$~设成所要使用的格式     2.调用函数w

Linux下date命令,格式化输出,时间设置

date命令的帮助信息 [root@localhost  source]# date --help用法:date [选项]... [+格式] 或:date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]以给定的格式显示当前时间,或是设置系统日期. -d,--date=字符串              显示指定字符串所描述的时间,而非当前时间  -f,--file=日期文件            类似--date,从日期文件中按行读入时间描述  -r,

C语言格式化输出小结

函数说明 在gcc编程中,我们常用到的字符格式化输出函数是printf的,实际上gcc继承了C语言处理字符具有强大功能的风格,它提供了一系列的格式化输出函数,主要存在两个库函数文件stdio.h/ stdarg.h中,具体函数如下: #include <stdio.h> printf, int printf(const char *format, ...); fprintf, int fprintf(FILE *stream, const char *format, ...); sprintf

Java格式化输出

Java的格式化输出等同于String.Format,与C有很大的相似,比如 System.out.printf("%8.2f", x);在printf中,可以使用多个参数,例如: System.out.printf("Hello, %s. Next year, you'll be %d", name, age); 用于printf的转换符如下表: 转换符 类型 举例 d 十进制整数 159 x 十六进制整数 9f o 八进制整数 237 f 定点浮点数 15.9

Log格式化输出JSON内容

以前常做的一件事就是把返回的json复制到格式化工具里看内容,Json格式化方法那么多直接格式化LOG不是很省事. 很早前写的简单LOG类(Log.java) import android.text.TextUtils; /** * 日志信息 * * @author Harlan Song * @createDate 2013-2-8 */ public class Log { /** * 日志开关 */ private static boolean isDebug = true; privat