Skip to content

Instantly share code, notes, and snippets.

@netgfx
Created December 22, 2023 13:31
Show Gist options
  • Save netgfx/b5eef7ddad62ced13a3b56b0d466c083 to your computer and use it in GitHub Desktop.
Save netgfx/b5eef7ddad62ced13a3b56b0d466c083 to your computer and use it in GitHub Desktop.
Stripe TaxID validation function
// code is A.I generated, use with care
function isValidTaxId(taxId, country) {
let regex;
switch (country) {
case 'US':
// US EIN format: 00-0000000
regex = /^(\d{2}-\d{7})$/;
break;
case 'DE':
// German VAT format: DE000000000
regex = /^(DE\d{9})$/;
break;
case 'AU':
// Australian Business Number (AU ABN): 12345678912
regex = /^(\d{11})$/;
break;
case 'BR':
// Brazilian CNPJ number: 01.234.456/5432-10
regex = /^(\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2})$/;
break;
case 'CA':
// Canadian BN: 123456789
regex = /^(\d{9})$/;
break;
case 'CL':
// Chilean TIN: 12.345.678-K
regex = /^(\d{2}\.\d{3}\.\d{3}-[A-Z])$/;
break;
case 'CN':
// Chinese tax ID: 123456789012345678
regex = /^(\d{18})$/;
break;
case 'EC':
// Ecuadorian RUC number: 1234567890001
regex = /^(\d{13})$/;
break;
case 'EG':
// Egyptian Tax Identification Number: 123456789
regex = /^(\d{9})$/;
break;
case 'HK':
// Hong Kong BR number: 12345678
regex = /^(\d{8})$/;
break;
case 'IN':
// Indian GST number: 12ABCDE3456FGZH
regex = /^(\d{2}[A-Z]{5}\d{4}[A-Z]{1}\d{1}[A-Z]{1}\d{1})$/;
break;
case 'JP':
// Japanese Corporate Number (*Hōjin Bangō*): 1234567891234
regex = /^(\d{13})$/;
break;
case 'LT':
// Lithuanian VAT: LT123456789
regex = /^(LT\d{9})$/;
break;
case 'LU':
// Luxembourg VAT: LU12345678
regex = /^(LU\d{8})$/;
break;
case 'LV':
// Latvian VAT: LV12345678901
regex = /^(LV\d{11})$/;
break;
case 'MT':
// Maltese VAT: MT12345678
regex = /^(MT\d{8})$/;
break;
case 'NL':
// Dutch VAT: NL123456789B01
regex = /^(NL\d{9}B\d{2})$/;
break;
case 'PL':
// Polish VAT: PL1234567890
regex = /^(PL\d{10})$/;
break;
case 'PT':
// Portuguese VAT: PT123456789
regex = /^(PT\d{9})$/;
break;
case 'RO':
// Romanian VAT: RO1234567890
regex = /^(RO\d{10})$/;
break;
case 'SE':
// Swedish VAT: SE123456789001
regex = /^(SE\d{12})$/;
break;
case 'SI':
// Slovenian VAT: SI12345678
regex = /^(SI\d{8})$/;
break;
case 'SK':
// Slovak VAT: SK1234567890
regex = /^(SK\d{10})$/;
break;
case 'TR':
// Turkish VAT: TR1234567890
regex = /^(TR\d{10})$/;
break;
case 'TW':
// Taiwanese VAT: TW12345678
regex = /^(TW\d{8})$/;
break;
case 'UA':
// Ukrainian VAT: UA1234567890
regex = /^(UA\d{10})$/;
break;
case 'UK':
// UK VAT: GB123456789
regex = /^(GB\d{9})$/;
break;
case 'VN':
// Vietnamese VAT: VN1234567890A1
regex = /^(VN\d{10}[A-Z]\d)$/;
break;
case 'AD':
// Andorran NRT number: A-123456-Z
regex = /^(A-\d{6}-[A-Z])$/;
break;
case 'AR':
// Argentinian tax ID number: 12-3456789-01
regex = /^(\d{2}-\d{8}-\d{2})$/;
break;
case 'BE':
// Belgian VAT: BE0123456789
regex = /^(BE\d{10})$/;
break;
case 'BO':
// Bolivian tax ID: 123456789
regex = /^(\d{9})$/;
break;
case 'BG':
// Bulgarian VAT: BG123456789
regex = /^(BG\d{9})$/;
break;
case 'CL':
// Chilean TIN: 12.345.678-K
regex = /^(\d{2}\.\d{3}\.\d{3}-[A-Z])$/;
break;
case 'CO':
// Colombian NIT number: 123.456.789-0
regex = /^(\d{3}\.\d{3}\.\d{3}-\d)$/;
break;
case 'CR':
// Costa Rican tax ID: 1-234-567890
regex = /^(\d-\d{3}-\d{6})$/;
break;
case 'HR':
// Croatian VAT: HR12345678912
regex = /^(HR\d{11})$/;
break;
case 'CY':
// Cypriot VAT: CY12345678Z
regex = /^(CY\d{8}[A-Z])$/;
break;
case 'CZ':
// Czech VAT: CZ1234567890
regex = /^(CZ\d{10})$/;
break;
case 'DK':
// Danish VAT: DK12345678
regex = /^(DK\d{8})$/;
break;
case 'DO':
// Dominican RCN number: 123-4567890-1
regex = /^(\d{3}-\d{7}-\d)$/;
break;
case 'SV':
// El Salvadorian NIT number: 1234-567890-123-4
regex = /^(\d{4}-\d{6}-\d{3}-\d)$/;
break;
case 'EE':
// Estonian VAT: EE123456789
regex = /^(EE\d{9})$/;
break;
case 'FI':
// Finnish VAT: FI12345678
regex = /^(FI\d{8})$/;
break;
case 'FR':
// French VAT: FRAB123456789
regex = /^(FR[A-Z]{2}\d{9})$/;
break;
case 'GE':
// Georgian VAT: 123456789
regex = /^(\d{9})$/;
break;
case 'GR':
// Greek VAT: EL123456789
regex = /^(EL\d{9})$/;
break;
case 'HU':
// Hungarian VAT: HU12345678
regex = /^(HU\d{8})$/;
break;
case 'IS':
// Icelandic VAT: 123456
regex = /^(\d{6})$/;
break;
case 'ID':
// Indonesian NPWP number: 12.345.678.9-012.345
regex = /^(\d{2}\.\d{3}\.\d{3}\.\d-\d{3}\.\d{3})$/;
break;
case 'IE':
// Irish VAT: IE1234567AB
regex = /^(IE\d{7}[A-Z]{1,2})$/;
break;
case 'IT':
// Italian VAT: IT12345678912
regex = /^(IT\d{11})$/;
break;
case 'LV':
// Latvian VAT: LV12345678901
regex = /^(LV\d{11})$/;
break;
case 'LT':
// Lithuanian VAT: LT123456789
regex = /^(LT\d{9})$/;
break;
case 'LU':
// Luxembourg VAT: LU12345678
regex = /^(LU\d{8})$/;
break;
case 'MY':
// Malaysian Service Tax: 12345678912
regex = /^(\d{11})$/;
break;
case 'MT':
// Maltese VAT: MT12345678
regex = /^(MT\d{8})$/;
break;
case 'MX':
// Mexican VAT: MX1234567890
regex = /^(MX\d{10})$/;
break;
case 'NL':
// Dutch VAT: NL123456789B01
regex = /^(NL\d{9}B\d{2})$/;
break;
case 'NZ':
// New Zealand GST: 12345678912
regex = /^(\d{11})$/;
break;
case 'NO':
// Norwegian VAT: NO123456789
regex = /^(NO\d{9})$/;
break;
case 'PL':
// Polish VAT: PL1234567890
regex = /^(PL\d{10})$/;
break;
case 'PT':
// Portuguese VAT: PT123456789
regex = /^(PT\d{9})$/;
break;
case 'RO':
// Romanian VAT: RO1234567890
regex = /^(RO\d{10})$/;
break;
case 'SA':
// Saudi Arabian VAT: 1234567890
regex = /^(\d{10})$/;
break;
case 'SG':
// Singaporean GST: 12345678912
regex = /^(\d{11})$/;
break;
case 'SK':
// Slovak VAT: SK1234567890
regex = /^(SK\d{10})$/;
break;
case 'SI':
// Slovenian VAT: SI12345678
regex = /^(SI\d{8})$/;
break;
case 'ZA':
// South African VAT: 1234567890
regex = /^(\d{10})$/;
break;
case 'KR':
// South Korean VAT: 1234567890
regex = /^(\d{10})$/;
break;
case 'ES':
// Spanish VAT: ES12345678Z
regex = /^(ES\d{8}[A-Z])$/;
break;
case 'SE':
// Swedish VAT: SE123456789001
regex = /^(SE\d{12})$/;
break;
case 'CH':
// Swiss VAT: CHE123456789
regex = /^(CHE\d{9})$/;
break;
case 'TH':
// Thai VAT: 1234567890123
regex = /^(\d{13})$/;
break;
case 'TR':
// Turkish VAT: TR1234567890
regex = /^(TR\d{10})$/;
break;
case 'AE':
// UAE VAT: 123456789012345
regex = /^(\d{15})$/;
break;
default:
return false;
}
return regex.test(taxId);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment