【发布时间】:2013-08-21 01:33:25
【问题描述】:
增值税号码不是随机或顺序生成的,而是基于一个公式,可以检查该号码是否有效。如果增值税号无效,则企业无法重新申请增值税。
要手动验证英国增值税号,您可以执行以下练习:
排除前 2 个字母,垂直列出数字,然后将每个数字乘以一个以 8 开头并以 2 结尾的值。然后将所有的总和相加并从总和中减去 97,直到答案是否定的。负数应等于增值税号的最后 2 位数字。
例如,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<int> integerList = new List<int>();
int b = 8;
for (int a = 0; a < textBox1.Text.Length; a++)
{
integerList.Add(int.Parse(textBox1.Text[a].ToString()));
}
foreach (int item in integerList)
{
listBox1.Items.Add(item * b);
--b;
}
我仍然需要计算列表的总和并进行其余的计算,并希望能够挑选一些人的大脑来了解其他可能的方法(更简单的方法)。
更新我自己的方法并感谢下面的 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);
【问题讨论】:
-
这是一个有趣的问题,但是您尝试过什么,您对 C# 的理解程度如何?如果您有基本的了解,该算法应该相当简单。一个提示是查看获取增值税号的字符串表示,并使用数组运算符来获取它的值,逐个字符...
-
@KirstyWhite 为了变得更好,你不断尝试,让人们看到你所做的事情(即使你认为这是令人尴尬的错误),你接受建议和建设性的批评,你忽略了喷子和怀疑和所有那些告诉你你没用的东西,你永远不会放弃。存在这样的地方的部分原因是为了让人们尝试和改进。
-
@Russ C: 或更多数学解决方案 - 使用
% -
您的初始公式不正确有两个原因 - 自 2010 年 HMRC 发布带有 9755 校验和的数字 - 所以 % 97 然后减去 55。数字中的零也应计为 10(所以数字从 104 开始是 1*8 + 10*7 + 4*6)