首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >银行识别码验证器

银行识别码验证器
EN

Stack Overflow用户
提问于 2014-01-30 18:20:28
回答 1查看 310关注 0票数 0

我对objective并不熟悉,也不太了解Java,我的问题是:

我在Java中有这样的代码来验证银行标识号:

代码语言:javascript
复制
 public static boolean isValidNIB(String nib) {
    char[] toValidate = nib.substring(0, 19).toCharArray();
    Integer checkDigit = Integer.valueOf(nib.substring(19));
    Integer[] wi = { 73, 17, 89, 38, 62, 45, 53, 15, 50, 5, 49, 34, 81, 76, 27, 90, 9, 30, 3 };
    Integer sum = 0;
    for (int i = 0; i < 19; i++) {
        sum += Character.digit(toValidate[i], 10) * wi[i];
    }
    return checkDigit.equals(98 - (sum % 97));
}

我需要把这段代码转换成目标c,问题是我不能让它工作.

下面是我将java代码转换为目标-c的尝试:

代码语言:javascript
复制
NSString *nib = @"003500970000199613031"; //UNICEF NIB :P

//transforms nsstring to array of chars
NSMutableArray *chars = [[NSMutableArray alloc] initWithCapacity:[nib length]];
for (int i=0; i < [nib length]; i++) {
    NSString *ichar  = [NSString stringWithFormat:@"%C", [nib characterAtIndex:i]];
    [chars addObject:ichar];
}

NSLog(@"array nib = %@",chars);


//retrieves the first 19 chars
NSMutableArray *toValidate = [[NSMutableArray alloc] init];
for (int i=0; i < chars.count; i++) {

    if (i <= 19) {
        [toValidate addObject:[chars objectAtIndex:i]];
    }
}

NSLog(@"array toValidate = %@",toValidate);

NSString * checkDigit = [nib substringWithRange:NSMakeRange(19, 1)];


NSArray *weight = [NSArray arrayWithObjects:@"73", @"17", @"89", @"38", @"62", @"45", @"53", @"15", @"50", @"5", @"49", @"34", @"81", @"76", @"27", @"90", @"9", @"30", @"3", nil];



NSInteger sum = 0;
for (int i = 0; i < weight.count ; i++) {

    sum += [[toValidate objectAtIndex:i] integerValue] * [[weight objectAtIndex:i] integerValue];

}

if (checkDigit.integerValue == (98 -(sum % 97))) {
    NSLog(@"VALD");
}else{
    NSLog(@"NOT VALID");
}

我相信这不是正确的方法,但这是有意义的。

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-30 18:45:59

至少有一个错误。你的

代码语言:javascript
复制
NSString * checkDigit = [nib substringWithRange:NSMakeRange(19, 1)];

从标识号(在本例中为"3")中只返回一个字符(位置19),但是

代码语言:javascript
复制
Integer checkDigit = Integer.valueOf(nib.substring(19));

计算从位置19开始的子字符串的值(在本例中为"31")。因此,计算的校验和与期望值不匹配。

但是您的代码中也有很多不必要的计算,因此没有理由将权重存储在字符串数组中。该方法可缩短为:

代码语言:javascript
复制
NSString *nib = @"003500970000199613031";

int weight[] = { 73, 17, 89, 38, 62, 45, 53, 15, 50, 5, 49, 34, 81, 76, 27, 90, 9, 30, 3 };
NSInteger sum = 0;
for (int i = 0; i < 19; i++) {
    sum += [[nib substringWithRange:NSMakeRange(i, 1)] intValue] * weight[i];
}
int checkDigit = [[nib substringFromIndex:19] intValue];
if (checkDigit == (98 - (sum % 97))) {
    NSLog(@"VALID");
} else {
    NSLog(@"NOT VALID");
}

输出是“有效”的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21464495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档