Java 如何在android中验证伊朗Melli代码(国家代码或Melli代码)

Java 如何在android中验证伊朗Melli代码(国家代码或Melli代码),java,android,validation,Java,Android,Validation,我需要一种方法来验证伊朗人的Melli代码(国家代码或Melli代码) 我知道它有一个公式。这个方法验证了伊朗人民的国家代码 public boolean validateMelliCode(String melliCode) { String[] identicalDigits = {"0000000000", "1111111111", "2222222222", "3333333333", "

我需要一种方法来验证伊朗人的Melli代码(国家代码或Melli代码)


我知道它有一个公式。

这个方法验证了伊朗人民的国家代码

public boolean validateMelliCode(String melliCode) {

    String[] identicalDigits = {"0000000000", "1111111111", "2222222222", "3333333333", "4444444444", "5555555555", "6666666666", "7777777777", "8888888888", "9999999999"};

    if (melliCode.trim().isEmpty()) {
        Toast.makeText(getApplicationContext(), "National Code is empty", Toast.LENGTH_LONG).show();
        return false; // National Code is empty
    } else if (melliCode.length() != 10) {
        Toast.makeText(getApplicationContext(), "National Code must be exactly 10 digits", Toast.LENGTH_LONG).show();
        return false; // National Code is less or more than 10 digits
    } else if (Arrays.asList(identicalDigits).contains(melliCode)) {
        Toast.makeText(getApplicationContext(), "MelliCode is not valid (Fake MelliCode)", Toast.LENGTH_LONG).show();
        return false; // Fake National Code
    } else {
        int sum = 0;

        for (int i = 0; i < 9; i++) {
            sum += Character.getNumericValue(melliCode.charAt(i)) * (10 - i);
        }

        int lastDigit;
        int divideRemaining = sum % 11;

        if (divideRemaining < 2) {
            lastDigit = divideRemaining;
        } else {
            lastDigit = 11 - (divideRemaining);
        }

        if (Character.getNumericValue(melliCode.charAt(9)) == lastDigit) {
            Toast.makeText(getApplicationContext(), "MelliCode is valid", Toast.LENGTH_LONG).show();
            return true;
        } else {
            Toast.makeText(getApplicationContext(), "MelliCode is not valid", Toast.LENGTH_LONG).show();
            return false; // Invalid MelliCode
        }
    }
}
我们也不需要这部分条件:

else if (Arrays.asList(identicalDigits).contains(melliCode)) {
        Toast.makeText(getApplicationContext(), "MelliCode is not valid (Fake MelliCode)", Toast.LENGTH_LONG).show();
        return false; // Fake National Code
    } 
祝你好运

干得好,Alireza, 这是我的代码,它与你的非常相似

‍‍‍

private boolean isValidNationalCode(String nationalCode) {
    if (nationalCode.length() != 10) {
      return false;
    } else {
      //Check for equal numbers
      String[] allDigitEqual = {"0000000000", "1111111111", "2222222222", "3333333333",
          "4444444444", "5555555555", "6666666666", "7777777777", "8888888888", "9999999999"};
      if (Arrays.asList(allDigitEqual).contains(nationalCode)) {
        return false;
      } else {
        int sum = 0;
        int lenght = 10;
        for (int i = 0; i < lenght - 1; i++) {
          sum += Integer.parseInt(String.valueOf(nationalCode.charAt(i))) * (lenght - i);
        }

        int r = Integer.parseInt(String.valueOf(nationalCode.charAt(9)));

        int c = sum % 11;

        return (((c < 2) && (r == c)) || ((c >= 2) && ((11 - c) == r)));
      }

    }
  }
专用布尔值isValidNationalCode(字符串nationalCode){
如果(nationalCode.length()!=10){
返回false;
}否则{
//检查数字是否相等
字符串[]allDigitEqual={“0000000000”、“1111111”、“2222222”、“3333333333”,
"4444444444", "5555555555", "6666666666", "7777777777", "8888888888", "9999999999"};
if(Arrays.asList(allDigitEqual.contains)(国家代码)){
返回false;
}否则{
整数和=0;
内部长度=10;
对于(int i=0;i=2)和((11-c)==r));
}
}
}

您可以这样验证您的国家代码:

更新
公共静态布尔值isValidNationalCode(字符串nationalCode)
{
如果(!nationalCode.matches(“^\\d{10}$”)
返回false;
整数和=0;
对于(int i=0;i<9;i++)
{
sum+=Character.getNumericValue(nationalCode.charAt(i))*(10-i);
}
int lastDigit=Integer.parseInt(String.valueOf(nationalCode.charAt(9));
整数除以剩余=总和%11;
返回((divideRemaining<2&&lastDigit==divideRemaining)| |(divideRemaining>=2&&11-divideRemaining==lastDigit));
}

我有不同的版本,下面是它的Kotlin版本

fun isValidIranianNationalCode(input: String) = input.takeIf { it.length == 10 }
    ?.mapNotNull(Char::digitToIntOrNull)?.takeIf { it.size == 10 }?.let {
        val check = it[9]
        val sum = (0..8).sumOf { i -> it[i] * (10 - i) } % 11
        if (sum < 2) check == sum else check + sum == 11
    } ?: false
fun isValidIranianNationalCode(输入:字符串)=input.takeIf{it.length==10}
?.mapNotNull(Char::digitToIntOrNull)?.takeIf{it.size==10}?let{
val check=it[9]
val sum=(0..8).sumOf{i->it[i]*(10-i)}%11
如果(总和<2)检查==总和其他检查+总和==11
}?:错

对于Javascript开发人员:

const checkCodeMeli=code=>{
控制台日志(“an”);
var L=代码长度;
if(L<8 | | parseInt(code,10)==0)返回false;
代码=(“0000”+代码).substr(L+4-10);
if(parseInt(code.substr(3,6),10)==0)返回false;
var c=parseInt(代码substr(9,1,10));
var s=0;
对于(变量i=0;i<9;i++){
s+=parseInt(代码substr(i,1),10)*(10-i);
}
s=s%11;
返回(s<2&&c==s)| |(s>=2&&c==11-s);
};
爪哇8

import java.util.stream.Streams;
导入java.util.function.IntUnaryOperator;
公共静态布尔值IsValidirAnationalCode(字符串输入){
如果(!input.matches(“^\\d{10}$”)
返回false;
int check=Integer.parseInt(input.substring(9,10));
int sum=IntStream.range(0,9)
.map(x->Integer.parseInt(input.substring(x,x+1))*(10-x))
.sum()%11;
返回(sum<2&&check==sum)| |(sum>=2&&check+sum==11);
}

首先,使用
System.Text.RegularExpressions
类,然后使用以下脚本:

#region NationalCode Check

public bool NationalCodeCheck(string input)
{
    if (!Regex.IsMatch(input, @"^\d{10}$"))
        return false;

    var check = Convert.ToInt32(input.Substring(9, 1));
    var sum = Enumerable.Range(0, 9)
            .Select(x => Convert.ToInt32(input.Substring(x, 1)) * (10 - x))
            .Sum() % 11;

    return (sum < 2 && check == sum) || (sum >= 2 && check + sum == 11);
}

#endregion
#地区国家代码检查
public bool NationalCodeCheck(字符串输入)
{
if(!Regex.IsMatch(输入@“^\d{10}$”)
返回false;
var check=Convert.ToInt32(input.Substring(9,1));
var sum=可枚举范围(0,9)
.Select(x=>Convert.ToInt32(input.Substring(x,1))*(10-x))
.Sum()%11;
返回(sum<2&&check==sum)| |(sum>=2&&check+sum==11);
}
#端区

谢谢Arash,我应该在我的代码中添加一个像您的allDigitEqual数组一样的数组。哦,Arash有人有
“1111111111”
国家代码:))请检查。我认为我们必须接受由重复数字组成的国家代码。@AlirezaNoorali,谢谢。看起来你是对的,这10个代码都是有效的。对于像“0000000000”这样的标识符,你的方法返回true。@AlirezaNoorali。我们必须支持此国家代码。您是否有类似的“shenase melli”(注册用户)代码?嗯。。。你确定他们有不同的算法吗?是的。比较一下,是的,你是对的。由于我还不需要验证法律实体的国家身份,因此我没有实施它。
fun isValidIranianNationalCode(input: String) = input.takeIf { it.length == 10 }
    ?.mapNotNull(Char::digitToIntOrNull)?.takeIf { it.size == 10 }?.let {
        val check = it[9]
        val sum = (0..8).sumOf { i -> it[i] * (10 - i) } % 11
        if (sum < 2) check == sum else check + sum == 11
    } ?: false
import java.util.stream.Streams;
import java.util.function.IntUnaryOperator;
public static boolean isValidIranianNationalCode(String input) {
if (!input.matches("^\\d{10}$"))
    return false;

int check = Integer.parseInt(input.substring(9, 10));

int sum = IntStream.range(0, 9)
        .map(x -> Integer.parseInt(input.substring(x, x + 1)) * (10 - x))
        .sum() % 11;

return (sum < 2 && check == sum) || (sum >= 2 && check + sum == 11);
}
#region NationalCode Check

public bool NationalCodeCheck(string input)
{
    if (!Regex.IsMatch(input, @"^\d{10}$"))
        return false;

    var check = Convert.ToInt32(input.Substring(9, 1));
    var sum = Enumerable.Range(0, 9)
            .Select(x => Convert.ToInt32(input.Substring(x, 1)) * (10 - x))
            .Sum() % 11;

    return (sum < 2 && check == sum) || (sum >= 2 && check + sum == 11);
}

#endregion