2016-10-26 2 views
1

Wir suchen Australian TFN Zahlen von unseren Kunden eingegeben zu validieren. Gibt es irgendwo einen offiziellen Algorithmus?Gibt es einen Algorithmus zur Validierung der australischen TFN-Nummer?

Die Wikipedia page erwähnt über einen einfachen Modulo-11-Algorithmus, aber es scheint, es ist nur ein Beispiel.

+1

Das Beispiel auf dieser Seite tut für jede Ziffer der Gewichtungen geben. Derselbe Algorithmus wird [hier] (http://www.mathgen.ch/codes/tfn.html) (und anderen Orten) zur Verfügung gestellt. Aber wie auf beiden Seiten gesagt wird, liefert der ATO offiziell keine Details über den Algorithmus, obwohl bekannt ist, was er ist. – nnnnnn

+0

Ja, aber das ist was. Bis es etwas Offizielles gibt, können wir uns nicht auf diese Gewichtungsfaktoren verlassen, sonst könnten wir auch Fehler für gültige Zahlen werfen. :) – ElevatedLyf

+0

Es gibt einen ABN Validierungsalgorithmus hier aber nichts für die TFN - https://abr.business.gov.au/HelpAbnFormat.aspx – ElevatedLyf

Antwort

0

In Javascript:

var tfn = $('#tfn').val(); 

//remove spaces and update 
tfn = tfn.replace(/\s+/g, ''); 
$('#tfn').val(tfn); 

//remove hyphens and update 
tfn = tfn.replace(/[-]/g, ''); 
$('#tfn').val(tfn); 

//validate only digits 
var isNumber = /^[0-9]+$/.test(tfn); 
if(!isNumber) { 
    return doError('Invalid TFN, only numbers are allowed.'); 
} 

//validate length 
var length = tfn.length; 
if(length != 9) { 
    return doError('Invalid TFN, must have 9 digits.'); 
} 

var digits = tfn.split(''); 

//do the calcs 
var sum = (digits[0]*1) 
     + (digits[1]*4) 
     + (digits[2]*3) 
     + (digits[3]*7) 
     + (digits[4]*5) 
     + (digits[5]*8) 
     + (digits[6]*6) 
     + (digits[7]*9) 
     + (digits[8]*10); 

var remainder = sum % 11; 

if(remainder == 0) { 
    doSuccess('Valid TFN, hooray!'); 
} else { 
    return doError('Invalid TFN, check the digits.'); 
} 

Ref: https://github.com/steveswinsburg/tfn-validator/blob/master/tfn-validator.html

In C#:

static void Main(string[] args) 
{ 
    int count = 0; 
    StringBuilder sb = new StringBuilder(); 
    Random random = new Random(); 
    while (count < 500000) {     
     int randomNumber = random.Next(100000000, 999999999); 
     if (ValidateTFN(randomNumber.ToString())) 
     { 
      sb.AppendLine(randomNumber.ToString()); 
      count++; 
     } 
    } 
    System.IO.File.WriteAllText("TFNs.txt", sb.ToString()); 
} 


public static bool ValidateTFN(string tfn) 
{ 
    //validate only digits 
    if (!IsNumeric(tfn)) return false; 

    //validate length 
    if (tfn.Length != 9) return false; 

    var digits = tfn.ToArray(); 

    //do the calcs 
    var sum = (digits[0] * 1) 
      + (digits[1] * 4) 
      + (digits[2] * 3) 
      + (digits[3] * 7) 
      + (digits[4] * 5) 
      + (digits[5] * 8) 
      + (digits[6] * 6) 
      + (digits[7] * 9) 
      + (digits[8] * 10); 

    var remainder = sum % 11; 
    return (remainder == 0); 
} 

public static bool IsNumeric(string s) 
{ 
    float output; 
    return float.TryParse(s, out output); 
} 

In VB.Net:

Private Shared Sub Main(args As String()) 
    Dim count As Integer = 0 
    Dim sb As New StringBuilder() 
    Dim random As New Random() 
    While count < 500000 
     Dim randomNumber As Integer = random.[Next](100000000, 999999999) 
     If ValidateTFN(randomNumber.ToString()) Then 
      sb.AppendLine(randomNumber.ToString()) 
      count += 1 
     End If 
    End While 
    System.IO.File.WriteAllText("TFNs.txt", sb.ToString()) 
End Sub 


Public Shared Function ValidateTFN(tfn As String) As Boolean 
    'validate only digits 
    If Not IsNumeric(tfn) Then 
     Return False 
    End If 

    'validate length 
    If tfn.Length <> 9 Then 
     Return False 
    End If 

    Dim digits = tfn.ToArray() 

    'do the calcs 
    Dim sum = (digits(0) * 1) + (digits(1) * 4) + (digits(2) * 3) + (digits(3) * 7) + (digits(4) * 5) + (digits(5) * 8) + (digits(6) * 6) + (digits(7) * 9) + (digits(8) * 10) 

    Dim remainder = sum Mod 11 
    Return (remainder = 0) 
End Function 

Public Shared Function IsNumeric(s As String) As Boolean 
    Dim output As Single 
    Return Single.TryParse(s, output) 
End Function 
+0

Dank Jeremy .. auf der Wikipedia-Seite gleich sind die mit einem Gewicht von Ziffern in Ihrer Lösung, aber sie sind die offiziellen aus der Steuerabteilung sind, jeder Anhaltspunkt? – ElevatedLyf

+0

Ja, das sind sie. Sie können das Australian Tax Office wenden Sie sich direkt @nnnnnn: http://softwaredevelopers.ato.gov.au/obtainTFNalgorithm. Ich arbeite im Finanzwesen und habe diesen Code in der Produktion. Es ist richtig. –

Verwandte Themen