VAT 番号は、ランダムまたは順番に生成されるのではなく、番号が有効かどうかを確認できる式に基づいています。VAT 番号が無効な場合、企業は VAT を再請求できません。
英国の VAT 番号を手動で検証するには、次の演習を実行できます。
最初の 2 文字を除いて、数字を縦に並べ、それぞれに 8 から始まり 2 で終わる値を掛けます。次に、すべての合計を合計し、答えがマイナスになるまで合計から 97 を差し引きます。マイナスの合計は、VAT 番号の下 2 桁に等しくなければなりません。
たとえば、VAT 番号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
最後の 2 桁と同じです。したがって、VAT 番号は有効です。
英国の VAT 番号を入力として受け取り、上記の式を使用してチェックサムを計算し、番号が有効か無効かを示す 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のおかげで、私自身の方法とabitを更新します。
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);