C# 验证C中的增值税编号#
增值税编号不是随机或顺序生成的,而是基于一个可以检查数字是否有效的公式。如果增值税编号无效,则企业不能重新申请增值税 要手动验证英国增值税编号,您可以执行以下操作: 不包括前两个字母,垂直列出数字,并将每个数字乘以一个以8开头、以2结尾的值。然后把你所有的总数加起来,从总数中扣除97,直到答案是否定的。负和应等于增值税编号的最后两位数字 例如,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
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);
因为位置上的数字