离线验证增值税号

时间:2010-08-30 09:19:02

标签: c# validation

我正在编写一个带有来自文件的不同输入的小应用程序(如国家代码,增值税号等),我必须验证增值税号码的格式是否正确。

我试过这个: http://www.codeproject.com/KB/webservices/VATchecker.aspx - 并且它有效......但是,是的,总有一个但是:-),我必须检查100到500个增值数字的任何地方,而且它太慢了。此外,我不确定他们是否感谢我这样锤击他们的网站。

有没有人知道我可以构建到我的C#程序中的离线增值验证器?

6 个答案:

答案 0 :(得分:11)

基于@Uwe Keim(过时)回答我使用以下规则制作2014年的正则表达式:http://www.bzst.de/DE/Steuern_International/USt_Identifikationsnummer/Merkblaetter/Aufbau_USt_IdNr.html?nn=23440

AT ^ATU[A-Z0-9]{8,8}$ 
BE ^BE[0-9]{10,10}$ 
BG ^BG[0-9]{9,9}$|^BG[0-9]{10,10}$
CY ^CY[0-9]{8,8}[A-Z]{1,1}$ 
CZ ^CZ[0-9]{8,10}$
DE ^DE[0-9]{9,9}$
DK ^DK[0-9]{8,8}$
EE ^EE[0-9]{9,9}$
ES ^ES[A-Z0-9]{1,1}[0-9]{7,7}[A-Z0-9]{1,1}$ 
FI ^FI[0-9]{8,8}$ 
FR ^FR[A-Z0-9]{2,2}[0-9]{9,9}$ 
GB ^GB[0-9]{9,9}$|^GB[0-9]{12,12}$|^GBGD[0-9]{3,3}$|^GBHA[0-9]{3,3}$ 
HU ^HU[0-9]{8,8}$ 
IE ^IE[0-9]{1,1}[A-Z0-9]{1,1}[0-9]{5,5}[A-Z]{1,1}$|^IE[0-9]{7,7}[A-W]{1,1}[A-I]{1,1}$ 
IT ^IT[0-9]{11,11}$ 
LT ^LT[0-9]{9,9}$|^LT[0-9]{12,12}$
LU ^LU[0-9]{8,8}$ 
LV ^LV[0-9]{11,11}$ 
MT ^MT[0-9]{8,8}$ 
NL ^NL[A-Z0-9]{9,9}B[A-Z0-9]{2,2}$ 
PL ^PL[0-9]{10,10}$   
PT ^PT[0-9]{9,9}$
SE ^SE[0-9]{10,10}01$
SI ^SI[0-9]{8,8}$
SK ^SK[0-9]{10,10}$
RO ^RO[1-9]{1,1}[0-9]{1,9}$
EL ^EL[0-9]{9,9}$ 
HR ^HR[0-9]{11,11}$ 

有人可能需要它。

答案 1 :(得分:8)

在我们的在线商店中,我所做的与代码项目文章中的解决方案类似。

在将其提交给Web服务之前,我会做一个小的正则表达式健全性检查,以过滤掉“合理的”错误的增值税ID,从而减少我必须执行的SOAP调用次数。

这是我用来存储正则表达式的表的摘录,如果您计划类似的话,这可能会对您有所帮助:

Code2    VatIDRegex
----------------------------------------------------------
at       ^ATU[A-Z0-9]{8,8}$
be       ^BE[0-9]{9,9}$
cy       ^CY[0-9]{9,9}$
cz       ^CZ[0-9]{8,10}$
de       ^DE[0-9]{9,9}$
dk       ^DK[0-9]{8,8}$
ee       ^EE[0-9]{9,9}$
es       ^ES[A-Z0-9]{1,1}[0-9]{7,7}[A-Z0-9]{1,1}$
fi       ^FI[0-9]{8,8}$
fr       ^FR[A-Z0-9]{2,2}[0-9]{9,9}$
gb       ^GB[0-9]{9,9}$|^GB[0-9]{12,12}$|^GBGD[0-9]{3,3}$
hu       ^HU[0-9]{8,8}$
ie       ^IE[A-Z0-9]{8,8}$
it       ^IT[0-9]{11,11}$
lt       ^LT[0-9]{9,9}$|^LT[0-9]{12,12}$
lu       ^LU[0-9]{8,8}$
lv       ^LV[0-9]{11,11}$
mt       ^MT[0-9]{8,8}$
nl       ^NL[A-Z0-9]{9,9}B[A-Z0-9]{2,2}$
pl       ^PL[0-9]{10,10}$
pt       ^PT[0-9]{9,9}$
se       ^SE[0-9]{12,12}$
si       ^SI[0-9]{8,8}$
sk       ^SK[0-9]{10,10}$

答案 2 :(得分:3)

你可以尝试这个http://code.google.com/p/vat-validation/ 它仍在进行中,但几乎所有欧盟国家都有代码。

答案 3 :(得分:1)

如果您查看this网站,他们会为每个成员国指定增值税号的结构。可能你可以先检查一下你的数字是否正确,这可能会避免做一些请求。

除此之外,我认为您必须使用此Web服务来验证数字。 Web服务不链接到单个数据库,而是连接到每个州的数据库以验证数量,因此没有可下载的单个数据库(可能某些州会下载您可以下载的所有有效增值税号,但我怀疑它,你必须确保它保持最新等。)

正如Steven在他的评论中建议的那样,你可以通过同时做多个请求来加快速度。我不会想到这会是一个问题,但你可以随时通过电子邮件发送该页面上Q16中提到的地址,并询问他们是否可以。

答案 4 :(得分:0)

   if (vatNo.Length == 9)
            {
                int calcValue = 0;
                int index = 0;
                int checkDigit = Convert.ToInt32(vatNo.Substring(7, 2));

                for (int ordinate = 8; ordinate > 1; ordinate--)
                {
                    calcValue += Convert.ToInt32((vatNo.Substring(index, 1))) * ordinate;
                    index++;
                }
                while (calcValue > 0)
                {
                    calcValue -= 97;
                }
                if ((calcValue * -1) != checkDigit)
                {
                    Error
                }

            }

答案 5 :(得分:0)

如果它是您的选项,您可以使用js-lib(我也是):

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

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