Avatar billede angelenglen Nybegynder
27. november 2014 - 09:36 Der er 14 kommentarer og
1 løsning

Oversæt lille C# funktion til VB.Net

Jeg har brug for nedenstående C# funktion i VB.Net, men det er ikke lykkedes mig at oversætte den selv.

Nogen der er frisk på at hjælpe? :-)

        /// <summary>
        /// Checks the check digits of a Danish VAT number.
        /// </summary>
        /// <param name="vat">The vat.</param>
        /// <returns></returns>
        private static bool ValidateVAT_DK(String vat)
        {
            var i = 0;
            var total = new[] { 2, 7, 6, 5, 4, 3, 2, 1 }.Sum(m => GetInt(vat[i++]) * m);

            // The remainder should be 0 for it to be valid..
            return total % 11 == 0;
        }
Avatar billede arne_v Ekspert
27. november 2014 - 14:47 #1
http://www.developerfusion.com/tools/convert/csharp-to-vb/ giver:

Private Shared Function ValidateVAT_DK(vat As [String]) As Boolean
    Dim i = 0
    Dim total = New () {2, 7, 6, 5, 4, 3, _
        2, 1}.Sum(Function(m) GetInt(vat(System.Math.Max(System.Threading.Interlocked.Increment(i),i - 1))) * m)

    ' The remainder should be 0 for it to be valid..
    Return total Mod 11 Is 0
End Function

som man saa kan pynte til:

Private Shared Function ValidateVAT_DK(vat As String) As Boolean
    Dim i = 0
    Dim total = New () {2, 7, 6, 5, 4, 3, 2, 1}.Sum(Function(m) GetInt(vat(i)) * m)
        i = i + 1
    ' The remainder should be 0 for it to be valid..
    Return total Mod 11 Is 0
End Function

Utestet!!
Avatar billede angelenglen Nybegynder
27. november 2014 - 15:02 #2
Det har jeg prøvet, det virker desværre ikke :-(

Overraskende, for den plejer at være god.

I linje 3 brokker den sig over "New ()", siger "Type expected".

Hvis jeg ændrer det til "New Integer()", får jeg næste fejl:
"GetInt(vat(i))" - GetInt is not declared.

Den brokker sig desuden i sidste linje over "11 is 0", som dog let er fixet med "11 = 0".

Dvs. følgende kode:
    Private Shared Function ValidateVAT_DK(vat As String) As Boolean
        Dim i = 0
        Dim total = New Integer() {2, 7, 6, 5, 4, 3, 2, 1}.Sum(Function(m) GetInt(vat(i)) * m)
        i = i + 1
        ' The remainder should be 0 for it to be valid..
        Return total Mod 11 = 0
    End Function


Men stadig problem med GetInt, der åbenbart ikke kendes af VB.Net?
Avatar billede angelenglen Nybegynder
27. november 2014 - 15:03 #3
PS. beklager at jeg ikke inkluderede mit eget fejlede forsøg i selve spørgsmålet, det burde jeg have gjort :-(
Avatar billede arne_v Ekspert
27. november 2014 - 15:17 #4
proev med Integer.Parse
Avatar billede angelenglen Nybegynder
27. november 2014 - 15:39 #5
Om det er Integer.Parse der er et forkert valg, eller om det er den funktion der var kilde for oversættelsen der fejler, ved jeg ikke helt, men det går ikke super godt :-(

Den skulle validere CVR numre, men den fejler gyldige numre.
Jeg tog nogle tilfældige numre fra CVR.dk og lavede en lille konsol applikation, men samtlige numre fejler.

Jeg lavede en kopi, der returnerer tallet, frem for blot Boolean værdien for om det er lig med 0.

Det er baseret på information fra følgende side:
http://erhvervsstyrelsen.dk/modulus_11

Hvor mon det går galt?

Output:
13453845:
False
8

29813124:
False
5

32310370:
False
2

27842453:
False
5

28948980:
False
5

29664218:
False
5

11111111:
False
8


Kode:
Module Module1

    Sub Main()
        Dim numbers() As String = New String() {"13453845", "29813124", "32310370", "27842453", "28948980", "29664218, "11111111""}
        For Each number As String In numbers
            Console.WriteLine(number & ":")
            Console.WriteLine(ValidateVAT_DK(number))
            Console.WriteLine(ValidateVAT_DK2(number))
            Console.WriteLine()
        Next
        Console.ReadLine()
    End Sub

    Public Function ValidateVAT_DK(vat As String) As Boolean
        Dim i = 0
        Dim total = New Integer() {2, 7, 6, 5, 4, 3, 2, 1}.Sum(Function(m) Integer.Parse(vat(i)) * m)
        i = i + 1
        ' The remainder should be 0 for it to be valid..
        Return total Mod 11 = 0
    End Function

    Public Function ValidateVAT_DK2(vat As String) As Integer
        Dim i = 0
        Dim total = New Integer() {2, 7, 6, 5, 4, 3, 2, 1}.Sum(Function(m) Integer.Parse(vat(i)) * m)
        i = i + 1
        ' The remainder should be 0 for it to be valid..
        Return total Mod 11
    End Function

End Module
Avatar billede angelenglen Nybegynder
27. november 2014 - 15:43 #6
Jeg lagde lige mærke til at array'et nok burde være:
{2, 7, 6, 5, 4, 3, 2}


frem for:
{2, 7, 6, 5, 4, 3, 2, 1}


Men jeg prøvede at ændre, og det løste ikke problemet.
De er stadig False alle sammen.
Værdierne fra ValidateVAT_DK2 er dog selvfølgelig anderledes, men ikke 0 som de burde være.

Kode:
Module Module1

    Sub Main()
        Dim numbers() As String = New String() {"13453845", "29813124", "32310370", "27842453", "28948980", "29664218", "11111111"}
        For Each number As String In numbers
            Console.WriteLine(number & ":")
            Console.WriteLine(ValidateVAT_DK(number))
            Console.WriteLine(ValidateVAT_DK2(number))
            Console.WriteLine()
        Next
        Console.ReadLine()
    End Sub

    Public Function ValidateVAT_DK(vat As String) As Boolean
        Dim i = 0
        Dim total = New Integer() {2, 7, 6, 5, 4, 3, 2}.Sum(Function(m) Integer.Parse(vat(i)) * m)
        i = i + 1
        ' The remainder should be 0 for it to be valid..
        Return total Mod 11 = 0
    End Function

    Public Function ValidateVAT_DK2(vat As String) As Integer
        Dim i = 0
        Dim total = New Integer() {2, 7, 6, 5, 4, 3, 2}.Sum(Function(m) Integer.Parse(vat(i)) * m)
        i = i + 1
        ' The remainder should be 0 for it to be valid..
        Return total Mod 11
    End Function

End Module
Avatar billede angelenglen Nybegynder
27. november 2014 - 15:45 #7
Glemte output:
13453845:
False
7

29813124:
False
3

32310370:
False
10

27842453:
False
3

28948980:
False
3

29664218:
False
3

11111111:
False
7
Avatar billede angelenglen Nybegynder
27. november 2014 - 15:46 #8
Hmm jeg ser nu desuden at der burde være 1 med til sidst i array'et, så se venligst bort fra det :-)
Avatar billede angelenglen Nybegynder
27. november 2014 - 16:00 #9
Jeg endte med at skrive det om.
Måske ikke den kønneste kode i verden, men det virker :-)

Kode:
Public Function ValidateVAT_DK(vat As String) As Boolean
        Try
            Dim vaegt() As Integer = New Integer() {2, 7, 6, 5, 4, 3, 2, 1}
            Dim vatnr(vat.Length) As Integer
            Dim total As Integer = 0

            For i As Integer = 0 To vat.Length - 1
                vatnr(i) = vat.Substring(i, 1)
            Next i

            For i As Integer = 0 To 7
                total = total + vatnr(i) * vaegt(i)
            Next

            Return total Mod 11 = 0

        Catch

            Return False

        End Try
    End Function
Avatar billede angelenglen Nybegynder
27. november 2014 - 16:00 #10
Din Integer.Parse fik mig dog på rette spor, så jeg vil gerne give dig points alligevel, hvis du lægger et svar :-)
Avatar billede angelenglen Nybegynder
27. november 2014 - 16:17 #11
Udvidede den til at kunne validere P-numre også, nu jeg var i gang.

Kode:
    Public Function ValidateVAT_DK(vat As String, Optional CheckPNumber As Boolean = False) As Boolean
        Try
            Dim vaegt() As Integer
            If Not CheckPNumber Then
                ' vaegt er altid den samme ved CVR numre: (http://erhvervsstyrelsen.dk/modulus_11)
                vaegt = New Integer() {2, 7, 6, 5, 4, 3, 2, 1}
            Else
                ' vaegt kan variere ved P-numre, eftersom numre lavere end 1.006.959.421 er oprettet med forkert vaegt.
                If IsNumeric(vat) AndAlso Integer.Parse(vat) <= 1006959421 Then
                    vaegt = New Integer() {1, 5, 6, 7, 3, 6, 4, 8, 9, 1}
                Else
                    vaegt = New Integer() {4, 3, 2, 7, 6, 5, 4, 3, 2, 1}
                End If
            End If

            Dim vatnr(vat.Length) As Integer
            For i As Integer = 0 To vat.Length - 1
                vatnr(i) = Integer.Parse(vat.Substring(i, 1))
            Next i

            Dim total As Integer = 0
            For i As Integer = 0 To vaegt.Length - 1
                total = total + vatnr(i) * vaegt(i)
            Next
            Return total Mod 11 = 0

        Catch
            Return False
        End Try
    End Function
Avatar billede arne_v Ekspert
28. november 2014 - 01:23 #12
i = i + 1

er anbragt forkert.

    Public Function ValidateVAT_DK(vat As String) As Boolean
        Dim i = 0
        Dim total = New Integer() {2, 7, 6, 5, 4, 3, 2, 1}.Sum(Function(m)
                                                                  Dim res As Integer = Integer.Parse(vat(i)) * m
                                                                  i = i + 1
                                                                  Return res
                                                              End Function)
        ' The remainder should be 0 for it to be valid..
        Return total Mod 11 = 0
    End Function
Avatar billede arne_v Ekspert
28. november 2014 - 01:24 #13

Imports System.Linq

Module Program
    Sub Main()
        Dim numbers() As String = New String() {"13453845", "29813124", "32310370", "27842453", "28948980", "29664218", "11111111"}
        For Each number As String In numbers
            Console.WriteLine(number & ":")
            Console.WriteLine(ValidateVAT_DK(number))
            Console.WriteLine(ValidateVAT_DK_Base(number))
            Console.WriteLine()
        Next
        Console.ReadLine()
    End Sub

    Public Function ValidateVAT_DK(vat As String) As Boolean
        Dim i = 0
        Dim total = New Integer() {2, 7, 6, 5, 4, 3, 2, 1}.Sum(Function(m)
                                                                  Dim res As Integer = Integer.Parse(vat(i)) * m
                                                                  i = i + 1
                                                                  Return res
                                                              End Function)
        ' The remainder should be 0 for it to be valid..
        Return total Mod 11 = 0
    End Function

 
    Public Function ValidateVAT_DK_Base(vat As String) As Boolean
        Try
            Dim vaegt() As Integer = New Integer() {2, 7, 6, 5, 4, 3, 2, 1}
            Dim vatnr(vat.Length) As Integer
            Dim total As Integer = 0

            For i As Integer = 0 To vat.Length - 1
                vatnr(i) = vat.Substring(i, 1)
            Next i

            For i As Integer = 0 To 7
                total = total + vatnr(i) * vaegt(i)
            Next

            Return total Mod 11 = 0

        Catch

            Return False

        End Try
    End Function   
End Module
Avatar billede arne_v Ekspert
28. november 2014 - 01:24 #14
og et svar
Avatar billede angelenglen Nybegynder
28. november 2014 - 08:28 #15
Ah det giver god mening med den i = i + 1 inde i funktionen.

Jeg har dog valgt at pakke funktionaliteten ind i en try/catch, så den returnerer fejl hvis eksempelvis der sendes et for kort tal, eller der sendes ren tekst der ikke kan parses til integer osv.

Jeg kopierede den desuden til en P-nummer validator.

System.Linq er ikke nødvendig at include.

    ''' <summary>Foretager modulus 11 tjek af nummeret, for at se om det er et gyldigt CVR-nummer.</summary>
    ''' <param name="vat">Værdien der skal tjekkes.</param>
    Public Function ValidateVAT_DK(vat As String) As Boolean
        Try
            Dim i = 0
            Dim total = New Integer() {2, 7, 6, 5, 4, 3, 2, 1}.Sum(Function(m)
                                                                      Dim res As Integer = Integer.Parse(vat(i)) * m
                                                                      i = i + 1
                                                                      Return res
                                                                  End Function)
            ' The remainder should be 0 for it to be valid.
            Return total Mod 11 = 0
        Catch ex As Exception
            Return False
        End Try
    End Function

    ''' <summary>Foretager modulus 11 tjek af nummeret, for at se om det er et gyldigt P-nummer.</summary>
    ''' <param name="pnr">Værdien der skal tjekkes.</param>
    Public Function ValidateP_DK(pnr As String) As Boolean
        Try
            Dim i = 0
            Dim vaegt() As Integer = New Integer() {4, 3, 2, 7, 6, 5, 4, 3, 2, 1}
            If Integer.Parse(pnr) <= 1006959421 Then vaegt = {1, 5, 6, 7, 3, 6, 4, 8, 9, 1}
            Dim total = vaegt.Sum(Function(m)
                                      Dim res As Integer = Integer.Parse(pnr(i)) * m
                                      i = i + 1
                                      Return res
                                  End Function)
            ' The remainder should be 0 for it to be valid.
            Return total Mod 11 = 0
        Catch ex As Exception
            Return False
        End Try
    End Function


Mange tak for hjælpen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester