Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 验证C中的增值税编号#_C#_Algorithm - Fatal编程技术网

C# 验证C中的增值税编号#

C# 验证C中的增值税编号#,c#,algorithm,C#,Algorithm,增值税编号不是随机或顺序生成的,而是基于一个可以检查数字是否有效的公式。如果增值税编号无效,则企业不能重新申请增值税 要手动验证英国增值税编号,您可以执行以下操作: 不包括前两个字母,垂直列出数字,并将每个数字乘以一个以8开头、以2结尾的值。然后把你所有的总数加起来,从总数中扣除97,直到答案是否定的。负和应等于增值税编号的最后两位数字 例如,BLABLA的增值税编号为GB 815382334,计算结果为: 8 x 8 = 64 1 x 7 = 7 5 x 6 = 30 3 x 5 = 15

增值税编号不是随机或顺序生成的,而是基于一个可以检查数字是否有效的公式。如果增值税编号无效,则企业不能重新申请增值税

要手动验证英国增值税编号,您可以执行以下操作:

不包括前两个字母,垂直列出数字,并将每个数字乘以一个以8开头、以2结尾的值。然后把你所有的总数加起来,从总数中扣除97,直到答案是否定的。负和应等于增值税编号的最后两位数字

例如,
BLABLA
的增值税编号为GB 815382334,计算结果为:

8 x 8 = 64
1 x 7 = 7 
5 x 6 = 30 
3 x 5 = 15 
8 x 4 = 32 
2 x 3 = 6 
3 x 2 = 6 
上述计算的总数为
64+7+30+15+32+6+6=160
从中扣除97,直到结果为负值,结果为
160–97-97=-34
,与最后两位数字相同:因此增值税编号有效

我想编写一个C#应用程序,将英国增值税数字作为输入,使用上述公式计算校验和,并指示数字是否有效

这对我来说是一个算法的练习。我在网上找到了增值税检查器,但我不明白它们是如何工作的,所以我希望有人能对上述问题给出一些简单的解释

更新

    public static bool isValidVATNumber(string theVATNumber)
    {
        string startChar = "^";
        string endChar = "$";
        bool rtn = false;
        int i = 8;
        string valString;
        int sum = 0;
        // Check that the string matches the requirements
        rtn = Regex.IsMatch(theVATNumber, (startChar + ("(([1-9]d{8})|([1-9]d{11}))" + endChar)), RegexOptions.Multiline);
        if (rtn)
        {
            // Perform the validation
            valString = theVATNumber;
            if (Regex.IsMatch(valString, (startChar + "[A-Z]{2}"), RegexOptions.Multiline))
            {
                valString = valString.Substring(2);
            }
            while ((i >= 2))
            {
                sum = (sum
                            + (i * int.Parse(valString.Substring(0, 1))));
                valString = valString.Substring(1);
                i--;
            }
            while ((sum > 0))
            {
                sum -= 97;
            }
            rtn = ((sum * -1)
                        == int.Parse(valString));
        }
        return rtn;
    }
注:上述方法不起作用,对我来说更难理解,我从我自己的方法开始,我发现它更容易使用,但还没有完成(请注意这是令人尴尬的)

List integerList=newlist();
int b=8;
对于(int a=0;a
我仍然需要计算列表的总和,然后进行其余的计算,我希望能从一些人的头脑中找出其他可能的方法(更简单的方法)

更新我自己的方法并感谢Pax,如下所示:

    List<int> integerList = new List<int>();
    List<int> sumList = new List<int>();
    int b = 8; // Will be 8 for the first multiplication.

    for (int a = 0; a <= 6; a++)
    {
        integerList.Add(int.Parse(textBox1.Text[a].ToString())); 
    }
    foreach (int item in integerList) // Loop once per input digit.
    {

        //listBox1.Items.Add(item * b);
        sumList.Add(item * b);
        --b; 
    }
    listBox1.DataSource = sumList;

    int sum = sumList.Sum();

    while (sum > 0)
    {
        sum = sum - 97;
    }
    int myInt = System.Math.Abs(sum);
    label1.Text = Convert.ToString(myInt);
List integerList=newlist();
List sumList=新列表();
int b=8;//第一次乘法是8。
对于(int a=0;a 0)
{
总和=总和-97;
}
int myInt=System.Math.Abs(总和);
label1.Text=Convert.ToString(myInt);

好的,让我们一点一点地看一下。假设您有代码
815382334
-您已经删除了前面不相关的字符

第一步是在字符之间循环,并在伪代码中保持数值乘以索引)的运行总数:

sum = 0
for pos = 0 to 6 inclusive:
    sum = sum + num_at(pos) * (8 - pos)
对于上面循环的每次迭代,您从字符串中提取正确的数字,并将其乘以其索引,该索引从
8
开始,一直到
2
。然后将其添加到
sum
变量中。请记住,
num_at()
方法需要提供从零到九(含九)的整数,而不是字符代码本身,它可能是
0x30
0x39

我经常发现初学者更容易坐下来运行程序,使用noggin作为CPU,使用一点纸作为存储,例如:

pos  num_at(pos)  8-pos  add  sum
---  -----------  -----  ---  ---
                                0
 0        8          8    64   64
 1        1          7     7   71
 2        5          6    30  101
 3        3          5    15  116
 4        8          4    32  148
 5        2          3     6  154
 6        3          2     6  160
第二步,按照规范,减去97,直到变为负值:

while sum > 0:
    sum = sum - 97
(尽管您可能可以更有效地使用模运算符)。再一次,在你的头脑中运行它:

sum
---
160
 63
 34-
然后,作为第三步也是最后一步,将最后两位数字(作为完整的两位数字)相加,以确保得到零:

sum = sum + num_at(7) * 10 + num_at(8)
return (sum == 0);
由于第7位和第8位的数字分别是
3
4
num_在(7)*10+num_在(8)
将为您提供
34
,这是您想要添加回负调整总和的数字

模版本允许以下内容:

sum = 0
for pos = 0 to 6 inclusive:
    sum = sum + num_at(pos) * (8 - pos)
return ((sum % 97) + num_at(7) * 10 + num_at(8) == 97);
这是因为
sum%97
实际上与循环相同,循环给您一个负数,但没有最后的减法97。因此,当您将最后两位数字相加时,您将得到97而不是0(对于有效的增值税编号)

例如,
160%97
为您提供
63
63+34
为您提供
97



现在,根据您添加的代码片段,您可能需要处理两种类型的VAT编号,即9位数字和12位数字。发布的代码片段可能比需要的要复杂一点,它的所有正则表达式检查和子字符串(长度检查、简单的字符串索引和字符检查就足够了)。

好的,让我们一点一点地看一下。假设您有代码
815382334
-您已经删除了前面不相关的字符

第一步是在字符之间循环,并在伪代码中保持数值乘以索引)的运行总数:

sum = 0
for pos = 0 to 6 inclusive:
    sum = sum + num_at(pos) * (8 - pos)
对于上面循环的每次迭代,您从字符串中提取正确的数字,并将其乘以其索引,该索引从
8
开始,一直到
2
。然后将其添加到
sum
变量中。请记住,
num_at()
方法需要提供从零到九(含九)的整数,而不是字符代码本身,它可能是
0x30
0x39

我经常发现初学者更容易坐下来运行程序,使用noggin作为CPU,使用一点纸作为存储,例如:

pos  num_at(pos)  8-pos  add  sum
---  -----------  -----  ---  ---
                                0
 0        8          8    64   64
 1        1          7     7   71
 2        5          6    30  101
 3        3          5    15  116
 4        8          4    32  148
 5        2          3     6  154
 6        3          2     6  160
第二步,按照规范,减去97,直到变为负值:

while sum > 0:
    sum = sum - 97
(尽管您可能可以更有效地使用模运算符)。再一次,在你的头脑中运行它:

sum
---
160
 63
 34-
然后,作为第三步也是最后一步,将最后两位数字(作为完整的两位数字)相加,以确保得到零:

sum = sum + num_at(7) * 10 + num_at(8)
return (sum == 0);
因为位置上的数字