【问题标题】:Russia VAT Number validation俄罗斯增值税号验证
【发布时间】:2012-11-27 09:20:33
【问题描述】:

是否有人有验证俄罗斯税务登记号 (VAT) 的代码。 C# 代码会很棒,但如果有人使用其他语言,它也会很有帮助。

格式(俄罗斯增值税号 = "税号" = "Идентификационный номер налогоплательщика"):

10位(法人)或12位(人),前两位为出生地区或公司注册地(外国公司,前导99后两位)MOD 11-10

第二次两次检查(2004 年之前,它发生了变化,现在保持不变)。

对于法人使用可变第二代码(KPP),通常前4位相同(99区域规则不适用),通常和默认XXXX01001。

KPP 也是计数器(最后 3 位)

KPP 的数量仅限于除 77 和 50 之外的地区的税务检查数量(每个地区仅一个),加上最大公司的一个代码。

来源: http://en.wikipedia.org/wiki/VAT_identification_number#VAT_numbers_of_non-EU_countries

【问题讨论】:

  • 您需要告诉我们什么是有效格式,然后人们才会帮助您。
  • 尝试给出此类数字的示例并描述适用于格式化它们的规则。
  • 寻找现有代码的关键在于它已经包含了俄罗斯增值税号的特定规则。好的,所以这并不适用于所有关于 SO 的提问者,但可以想象,buda 确实知道如何编程,并且能够在没有帮助的情况下从头开始。在我看来,问题的重点是不要从头开始。
  • @SteveJessop 你是对的,你很难过,我有能力从头开始写,但如果有人已经有程序,我想要。如果nobady没有,我写代码的时候一定会贴在这里的。
  • @SteveJessop 我完全同意你对这个问题最初含义的评估——但是,这不是一个购物问题吗?

标签: c# .net algorithm validation


【解决方案1】:

这是一个用于验证俄罗斯个人和公司增值税号的 C# 程序。请考虑应进行进一步的输入验证(验证传递的增值税号是否仅包含数字,它们是否具有所需的长度等):

using System;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        class VatNumber
        {
            private int[] _numericVatNumber;
            public int[] NumericVatNumber { get { return _numericVatNumber; } }

            public VatNumber(string vatNumber)
            {
                _numericVatNumber = vatNumber.ToCharArray().Select(i => int.Parse(i.ToString())).ToArray();
            }

            public virtual bool IsValid(){return false;}
        }

        class PersonalVatNumber : VatNumber
        {
            public override bool IsValid()
            {
                var n10 = ((2 * NumericVatNumber[0] +
                            4 * NumericVatNumber[1] +
                            10 * NumericVatNumber[2] +
                            3 * NumericVatNumber[3] +
                            5 * NumericVatNumber[4] +
                            9 * NumericVatNumber[5] +
                            4 * NumericVatNumber[6] +
                            6 * NumericVatNumber[7] +
                            8 * NumericVatNumber[8]) % 11) % 10;
                if (n10 == NumericVatNumber.Last())
                    return true;
                return false;
            }

            public PersonalVatNumber(string vatNumber)
                : base(vatNumber)
            {

            }
        }

        class CompanyVatNumber : VatNumber
        {
            public override bool IsValid()
            {
                var n11 = ((7 * NumericVatNumber[0] +
                            2 * NumericVatNumber[1] +
                            4 * NumericVatNumber[2] +
                            10 * NumericVatNumber[3] +
                            3 * NumericVatNumber[4] +
                            5 * NumericVatNumber[5] +
                            9 * NumericVatNumber[6] +
                            4 * NumericVatNumber[7] +
                            6 * NumericVatNumber[8] +
                            8 * NumericVatNumber[9]
                            ) % 11) % 10;
                                if (n11 != NumericVatNumber[10])
                    return false;
                var n12 = ((3 * NumericVatNumber[0] +
                            7 * NumericVatNumber[1] +
                            2 * NumericVatNumber[2] +
                            4 * NumericVatNumber[3] +
                            10 * NumericVatNumber[4] +
                            3 * NumericVatNumber[5] +
                            5 * NumericVatNumber[6] +
                            9 * NumericVatNumber[7] +
                            4 * NumericVatNumber[8] +
                            6 * NumericVatNumber[9] +
                            8 * NumericVatNumber[10]
                            ) % 11) % 10;

                if (n12 == NumericVatNumber.Last())
                    return true;
                return false;
            }

            public CompanyVatNumber(string vatNumber)
                : base(vatNumber)
            {

            }
        }

        static void Main(string[] args)
        {
            var companyVat = new CompanyVatNumber("123456789047");
            Console.WriteLine(companyVat.IsValid());

            var personalVat = new PersonalVatNumber("1234567894");
            Console.WriteLine(personalVat.IsValid());

        }
    }
}

【讨论】:

    【解决方案2】:

    如果你可以选择,你可以使用 js lib(我的也是如此):

    https://github.com/se-panfilov/jsvat

    它支持欧盟(以及俄罗斯)增值税号码。

    (jsvat 检查增值税号两次 - 使用正则表达式和数学计算)

    【讨论】:

      【解决方案3】:

      您可以在https://tin-check.com/ 上查看俄罗斯税号 它们是一个 API,您还可以对 100 多个国家/地区执行验证。

      可能是个不错的选择。

      【讨论】:

      • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多