2010-08-30 102 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檢查的增值稅數量的兩倍 - 用正則表達式,並用數學計算)