千分位&手机号验证&身份证号验证

前言:
        App开发者注意了,你还在为了验证一个手机号发愁吗?你还在为验证一个身份证号发愁吗?你还在为给一个数字添加千分位发愁吗?那你就OUT了。福利满满的来了,你只要下载【DigitManager】文件,你就可以拥有对数字处理的功能。有效提高你的开发效率。

1、在App开发的过程中,数据中数字的出现往往都占据重要的角色。例如:一些理财App 数值的千分位的添加至关重要;一些机关、银行的App 在身份验证等。还有一个普遍的模块,那就是获取用户的手机号。

2、呼朋唤友

  群的特点:

  1、IOS 开发交流群,每周都有更新新的内容。

  2、群里有3~5年的资深开发者。

  3、群员在App开发过程中遇到什么问题,可以在群里提问。

  4、群员在App开发中,如果遇到难实现的功能或者模块,可以在群里提出,有人员帮助你实现。

  5、加入群后,可以get到App 开发中的一些小功能模块。

  群号是:185341804   群名字:成功QQ吧

  群主号:1542100658 (qq)

3、代码区域

   1》千分位

   

/**

 添加千分位


 @param numberString  要添加的数字串

 @return  添加后的数字串

 */

+(NSString*)addDigThousands:(NSString*)numberString;

#pragma mark  ---- addDigThousands

+(NSString*)addDigThousands:(NSString*)numberString{

    if (numberString==nil||numberString.length==0) return @"0.00" ;

    /**

     判断系统的大小

     */

    unsigned short systemVerson = [UIDevice currentDevice].systemVersion.intValue;

    /**

     判断是否含有小数点

     */

    BOOL isDecimalPoint = NO;

    if (systemVerson>=8) {

        isDecimalPoint = [numberString containsString:@"."];

    }else{

        isDecimalPoint = [numberString componentsSeparatedByString:@"."].count>=2?YES:NO;

    }

    NSArray * array = [NSArray array];

    if (isDecimalPoint) {

        array = [numberString componentsSeparatedByString:@"."];

        numberString =array.firstObject;

    }

    /**

     转化成可变的字符串

     */

    NSMutableString * string = [NSMutableString stringWithString:numberString];

    /**

     获取整数部位的长度

     */

    NSInteger length = string.length;

    /**

     获取最终的长度

     */

    NSInteger KMlength = 0;

    if (length%3==0) {

        KMlength = length;

    }else{

        /**

         计算要补充的数值

         */

        KMlength = length +(3- length%3);

        for (unsigned i =0; i<(3-length%3); i++) {

            [string insertString:@"0" atIndex:0];

        }

    }

    /**

     插入千分位

     */

    NSMutableString * returnString = [NSMutableString stringWithCapacity:0];

    for (unsigned i = 1; i<=KMlength; i++) {

        if (i%3==0) {

            NSString * appendString = nil;

            appendString = [string substringWithRange:NSMakeRange(i-3, 3)];

            if (i==KMlength) {

                [returnString  appendString:[NSString stringWithFormat:@"%@",appendString]];

            }else{

                [returnString  appendString:[NSString stringWithFormat:@"%@,",appendString]];

            }

        }

    }

    /**

     获取数值的有效位

     */

    if (length%3!=0) {

        returnString = (NSMutableString*)[returnString substringFromIndex:(3-length%3)];

    }

    /**

     拼接小数部位

     */

    if (isDecimalPoint) {

        returnString = (NSMutableString*)[returnString stringByAppendingString:[NSString stringWithFormat:@".%@",array[1]]];

    }

    return returnString;

}


  2》检测是否全是数字
    

/**

 检测是否全部是数字


 @param numberString 要检测的数字串

 @return YES|NO

 */

+(BOOL)inspectDigit:(NSString*)numberString;

#pragma mark  ---- inspectDigit

+(BOOL)inspectDigit:(NSString*)numberString{

    /**

     判断是否存在

     */

    if (numberString.length==0||numberString==nil) return NO;

    /**

     创建字符串扫描对象

     */

    NSScanner* scan = [NSScanner scannerWithString:numberString];

    int val;

    return[scan scanInt:&val] && [scan isAtEnd];

}

  3》手机号的验证

/**

 检查手机号


 @param numberString 要检查的手机号串

 @return YES|NO

 */

+(BOOL)inspectCellphoneNumber:(NSString*)numberString;

#pragma mark  ---- inspectCellphoneNumber

+(BOOL)inspectCellphoneNumber:(NSString*)numberString{

    /**

     判断传入的参数是否存在

     */

    if (numberString.length==0||numberString==nil) return NO;

    /**

     清楚冗余的部分

     */

    numberString = [numberString stringByReplacingOccurrencesOfString:@"-" withString:@""];

    if (numberString.length==11) {

        /**

         创建标志

         */

        BOOL CMCC,CUCC,CTCC;

        /**

         * 移动号段正则表达式

         */

        NSString *CM_NUM = @"^((13[4-9])|(147)|(15[0-2,7-9])|(178)|(18[2-4,7-8]))\\d{8}|(1705)\\d{7}$";

        /**

         * 联通号段正则表达式

         */

        NSString *CU_NUM = @"^((13[0-2])|(145)|(15[5-6])|(176)|(18[5,6]))\\d{8}|(1709)\\d{7}$";

        /**

         * 电信号段正则表达式

         */

        NSString *CT_NUM = @"^((133)|(153)|(177)|(18[0,1,9]))\\d{8}$";

        NSPredicate *predCMCC = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM_NUM];

        CMCC = [predCMCC evaluateWithObject:numberString];

        NSPredicate *predCUCC = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU_NUM];

        CUCC = [predCUCC evaluateWithObject:numberString];

        NSPredicate *predCTCC = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT_NUM];

        CTCC = [predCTCC evaluateWithObject:numberString];

        if (CMCC || CUCC || CTCC) {

            return YES;

        }

    }

    return NO;

}

 4》身份证号

/**

 检测身份证


 @param numberString 要检测的身份证号

 @return YES|NO

 */

+(BOOL)inspectID:(NSString*)numberString;


#pragma mark  ---- inspectID

+(BOOL)inspectID:(NSString*)numberString{

    /**

     判断是否存在

     */

    if (numberString==nil||numberString.length==0) return NO;

    /**

     去除空格

     */

    numberString = [numberString stringByReplacingOccurrencesOfString:@" " withString:@""];

    /**

     校验身份证的位数

     */

    if (numberString.length==18) {

        /**

         求和身份证前17位的和

         */

        NSString * Front17String = [numberString substringToIndex:numberString.length-1];

        /**

         加权因子

         */

        NSArray * factorArray = @[@7,@9,@10,@5,@8,@4,@2,@1,@6,@3,@7,@9,@10,@5,@8,@4,@2];

        /**

         求和

         */

        int sum = 0;

        for (unsigned i =0; i<Front17String.length; i++) {

            const char value = [Front17String characterAtIndex:i];

            sum = sum + atoi(&value) * [factorArray[i] intValue];

        }

        ushort remainderValue = sum % 11;

        /**

         余数参考表

         */

        NSArray * remainderArray = @[@"1",@"0",@"X",@"9",@"8",@"7",@"6",@"5",@"4",@"3",@"2"];

        /**

         获取身份证最后一位

         */

        NSString * lastIDString = [numberString substringFromIndex:17];

        /**

         获取余数查询到的最后一位

         */

        NSString * remadinderQueryString = [remainderArray objectAtIndex:remainderValue];

        if ([lastIDString isEqualToString:remadinderQueryString]) {

            return YES;

        }

    }

    return NO;

}

4、代码下载
https://pan.baidu.com/s/1cxRUOI





&lt;think&gt;我们参考了用户提供的三个引用,其中展示了三种不同的数字千分位格式化方法: 1. 数组方式(使用数组反转和reduce) 2. 字符串方式(通过循环逆序处理) 3. 正则表达式方式(使用正则替换) 用户的问题是如何在JavaScript中实现数字千分位格式化。我们将分别介绍这三种方法,并给出代码示例和解释。 注意:千分位格式化的规则是从右向左每三位数加一个逗号,但要注意整数部分的开头不需要加逗号,小数部分不需要格式化(如果需求有小数部分,则需另外处理,但上述引用中只考虑整数部分,我们这里也先处理整数部分,然后会提到小数部分如何处理)。 步骤: 1. 方法一:数组方式(逆序reduce) 2. 方法二:字符串方式(逆序循环) 3. 方法三:正则表达式方式(推荐,简洁) 4. 考虑小数部分的情况(扩展) 我们将分别实现并测试。 注意:引用[1]中提供了两种方法(数组和字符串),引用[2]和[3]提供了正则方法,但正则表达式略有不同。 我们以整数部分为主,然后扩展小数部分。 方法一:数组方式(逆序reduce) - 将数字转为字符串,并分割成数组 - 反转数组(从右向左处理) - 使用reduce,每三位添加一个逗号,注意第一位不需要逗号(通过判断索引是否为0的倍数,但要注意第一个元素前面不加逗号) 方法二:字符串方式(逆序循环) - 从字符串的最后一个字符开始向前循环 - 每三个字符插入一个逗号,但注意开头不能加逗号 方法三:正则表达式 - 使用正则表达式:`/(?&lt;!\..*)(\d)(?=(?:\d{3})+(?!\d))/g` 或者 `/\B(?=(\d{3})+(?!\d))/g`(注意:这个正则不能用于有小数的情况,会匹配到小数部分) - 引用[3]中的正则:`/\B(?=(\d{3})+(?!\d))/g`,但注意这个正则会匹配非单词边界,并且要求后面是3的倍数个数字,且后面没有数字(即整数部分末尾) 对于小数部分的处理,我们需要先分离整数部分和小数部分,然后只对整数部分进行格式化,最后再拼接小数部分。 下面我们分别实现: 1. 数组方式(仅整数): 注意:只考虑整数,所以先取整(Math.floor)并转字符串。 2. 字符串方式(仅整数) 3. 正则表达式(仅整数) 然后,我们扩展一个可以处理小数的正则表达式方法。 另外,我们也可以使用Intl.NumberFormat,这是现代浏览器内置的方法,可以国际化格式化数字,包括千分位。虽然不是用户引用的方法,但也是常用方法,可以提一下。 实现:&lt;/think&gt;### JavaScript 实现数字千分位格式化的方法 在 JavaScript 中,数字千分位格式化是指将数字从右向左每三位添加一个逗号分隔符(如 `1234567` &rarr; `1,234,567`)。以下是三种常用方法,基于您提供的引用内容: --- #### 1. **数组反转法**(引用[1]方法) 通过将数字转为数组并反转后处理: ```javascript function formatThousands1(n) { const str = Math.floor(n).toString(); // 只处理整数部分 return str.split(&#39;&#39;).reverse().reduce((prev, val, idx) =&gt; { return (idx % 3 === 0 &amp;&amp; idx !== 0) ? val + &#39;,&#39; + prev : val + prev; }, &#39;&#39;); } ``` **原理**: - 数字转为字符串 &rarr; 拆分为字符数组 &rarr; 反转数组 - 每3位添加逗号(通过索引 `idx % 3 === 0` 判断) - 最后反转回正常顺序 **示例**: ```javascript console.log(formatThousands1(12050100)); // &quot;12,050,100&quot; ``` --- #### 2. **字符串逆序循环法**(引用[1]方法) 从数字末尾向前遍历并插入逗号: ```javascript function formatThousands2(n) { const str = Math.floor(n).toString(); let res = &#39;&#39;; for (let i = str.length - 1, j = 1; i &gt;= 0; i--, j++) { res = str[i] + res; if (j % 3 === 0 &amp;&amp; i !== 0) res = &#39;,&#39; + res; // 每3位加逗号(排除首位) } return res; } ``` **特点**: - 无需数组反转,直接操作字符串 - 通过变量 `j` 记录位置实现每3位插入逗号 --- #### 3. **正则表达式法**(推荐,引用[2][3]) 使用正则匹配实现简洁高效的处理: ```javascript function formatThousands3(n) { return n.toString().replace(/\B(?=(\d{3})+(?!\d))/g, &quot;,&quot;); } ``` **正则解析**: - `\B`:匹配非单词边界(避免在数字开头加逗号) - `(?=(\d{3})+(?!\d))`:正向预查,匹配连续3位数字的组 - `g`:全局匹配 **优势**: - 单行代码实现,简洁高效 - 支持整数和小数(如 `1234567.89` &rarr; `1,234,567.89`) --- #### 4. **扩展:处理小数部分** 若需完整处理小数,可拆分整数和小数部分: ```javascript function formatDecimal(n) { const [integer, decimal] = n.toString().split(&#39;.&#39;); return integer.replace(/\B(?=(\d{3})+(?!\d))/g, &quot;,&quot;) + (decimal ? `.${decimal}` : &#39;&#39;); } console.log(formatDecimal(1234567.89)); // &quot;1,234,567.89&quot; ``` --- #### 性能与适用场景对比 | 方法 | 优点 | 缺点 | |--------------------|--------------------------|--------------------------| | 数组反转法 | 逻辑清晰 | 需多次反转,性能较差 | | 字符串逆序循环法 | 避免数组操作 | 代码稍复杂 | | **正则表达式法** | **简洁高效,推荐使用** | 需理解正则语法 | | 小数处理扩展 | 完整支持浮点数 | 需额外拆分步骤 | &gt; **最佳实践**: &gt; - 纯整数场景:优先使用正则法(`formatThousands3`) &gt; - 含小数场景:使用扩展方法(`formatDecimal`) &gt; - 兼容性要求高:选择字符串循环法(`formatThousands2`) 实际测试结果: ```javascript const num = 1234567890; console.log(formatThousands3(num)); // &quot;1,234,567,890&quot; console.log(formatDecimal(12345.6789)); // &quot;12,345.6789&quot; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值