2010-08-30 67 views
9

我正在用一个文件(如countrycode,vat number等)输入不同输入的小应用程序,我必须验证增值税号码的格式是否正确。离线验证增值税号码

我已经试过这一个: http://www.codeproject.com/KB/webservices/VATchecker.aspx - 和它的作品..但,是的,总有一个,但:-),我要检查任何地方从100 - 500增值税号码,这对刚刚过慢。此外,我不确定他们是否欣赏我这样锤击他们的网站。

有人知道我可以构建到我的C#程序中的脱机增值验证器吗?

+0

是优化工作代码有什么问题吗? – leppie 2010-08-30 09:21:16

+0

你的意思是VATchecker代码,或? 根据VIES,他们的系统专为单一请求而非批量请求而设计。 – Thomas 2010-08-30 09:22:18

+0

为什么不尝试在多个线程上运行它。它没有帮助不敲打,但可能会加快你的应用程序的4到8倍。 – Steven 2010-08-30 09:23:36

回答

1

如果你看看this网站,他们确实为每个成员国指定增值税号码的结构。可能您可以先检查您的号码是否处于正确的结构中,这可能会避免必须执行某些请求。我想你将不得不使用这个web服务来验证数字。 Web服务不链接到单个数据库,而是连接到每个州的数据库以验证数字,因此没有可以下载的单个数据库(也许某些州将下载所有可以下载的有效增值税号码,但我怀疑它和你必须确保它保持最新等)。

正如史蒂文在他的评论中所暗示的那样,你可以通过同时做多个请求来加速它。我不会认为这会是一个问题,但你可以随时通过电子邮件发送Q16中提到的地址,并询问他们是否可以。

+0

是的,我正在看那个。根据国家代码,我可能不得不根据格式检查每个VAT号码。 不幸的是,我不认为在他们的网站上查找数百个增值税号码是最好的方法。对我来说会容易得多,但是我想我必须用困难的方法去做,并且手动检查它们,看看格式是否正确:( – Thomas 2010-08-30 09:35:31

+0

@Thomas:呃,这取决于你为什么要做这个检查。因为客户给了你一个增值税号码,然后那个增值税号码是无效的,我想你可能最终不得不支付你从未收到的增值税,所以在这种情况下, – 2010-08-30 09:40:35

+0

这是真的,我忘记写了,输入变量来自我们的Navision,所以增值税号码应该是有效的。问题是我们有很多我们的Navision数据库中的“占位符”条目是空的或“无增值税” 这些确实是我需要检查的条目我们的会计部门在创建客户时手动检查增值税号码 我知道这可能听起来有点混乱,但基本上我只是想知道是否有人写了一个函数,可以验证增值税号码的格式,根据Q16上的VIES :) – Thomas 2010-08-30 09:45:21

8

在我们的在线商店中,我采用了类似于代码项目文章中的解决方案。

在将其提交给Web服务之前,我会执行一个小的正则表达式完整性检查来过滤“合法”错误的VAT 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}$ 
+1

我已经创建了这些正则表达式的要点,通过@BigM的更正更新:http://stackoverflow.com/a/36942179/3057236 – geoforce 2016-04-29 15:27:59

+0

[这是链接到@ geoforce的要点](https://gist.github.com/gl005/e2e656d648a167ac6fed1a412975611c)。 – 2016-05-23 10:07:38

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 
       } 

      } 
11

基于@Uwe凯姆的(过时)回答我提出的regex'es 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

至少罗马尼亚模式不正确。数字的长度可以是2到10位数字。正确的模式将是^ RO [1-9] {1,1} [0-9] {1,9} $。 – Monsignor 2015-12-29 10:54:25

+1

我重新检查了其他图案,它们看起来正确。 – Monsignor 2016-01-11 15:20:15

+1

罗马尼亚没有最低定义,我认为他们只是使用所有数字。我纠正了它,谢谢你的评论 – BigM 2016-01-12 07:34:52

0

如果它是你的选择,你可以使用JS-LIB(我也是):

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

(jsvat检查的增值税数量的两倍 - 用正则表达式,并用数学计算)