none
Convertir pouces décimaux en pouces fractionnaux...problème avec entier !! RRS feed

  • Question

  • Bonjour à tous ! j'ai un petit soucis avec une Fonction que j'ai trouver sur le web, enfin, la fonction fait en sorte que si je tape un nombre décimal dans un TexBox donné et qu'avec un bouton j'ajoute cette donnée dans un DataGridView en appelant la Fonction cela fonctionne bien ex: 30.125 me donne 30 1/8 mais le problème est si je tape un nombre entier sans virgule (ou point) là j'ai une erreur : L'index se trouve en dehors des limites du tableau.

    voila le code (qui n'est pas de moi en passant ) :

       Function GetFraction(ByVal d As Double) As String
            'TRANSFERE LES POUCES DÉCIMAL EN FRACTIONAL (Code pris sur le net ! )
    
            ' Get the initial denominator: 1 * (10 ^ decimal portion length)
            Dim Denom As Int32 = CInt(1 * (10 ^ d.ToString.Split(","c)(1).Length))
    
            ' Get the initial numerator: integer portion of the number
            Dim Numer As Int32 = CInt(d.ToString.Split(","c)(1))
    
    
            ' Use the Euclidean algorithm to find the gcd
            Dim a As Int32 = Numer
            Dim b As Int32 = Denom
            Dim t As Int32 = 0 ' t is a value holder
    
            ' Euclidean algorithm
            While b <> 0
                t = b
                b = a Mod b
                a = t
            End While
    
            'Get whole part of the number
            Dim Whole As String = d.ToString.Split(","c)(0)
    
            ' Return our answer
            Return Whole & " " & (Numer / a) & "/" & (Denom / a)
    
    
    
        End Function

    et voila ma méthode d'entrée au DataGridView :

        Private Sub Button10_Click_1(sender As Object, e As EventArgs) Handles Button10.Click
    
            'AJOUTE LES DONNÉES AU TABLEUR
    
            haut1.Text = GetFraction(haut1.Text)
            larg1.Text = GetFraction(larg1.Text)
    
    
            table.Rows.Add(qt1.Text, haut1.Text, larg1.Text, code.Text)
    
                haut1.Text = ""
                larg1.Text = ""
                qt1.Text = ""
    
    
        End Sub

    Je ne suis pas très caler en matière de fonction mathématique sur VB donc je me gratte la tête un peu....

    J'ai essayer de mettre une condition dans la fonction mais cela me retourne seulement un entier et ce même si je met un nombre décimal...ce que j'ai essayer :

            'Get whole part of the number
            Dim Whole As String = d.ToString.Split(","c)(0)
    
            If Numer Or Denom = 0 Then
                Return Whole
            Else
    
                ' Return our answer
                Return Whole & " " & (Numer / a) & "/" & (Denom / a)
    
            End If
    
        End Function

    Merci de m'aider !! 

    samedi 2 juillet 2016 15:07

Réponses

  • J'ai trouvé mon bonheur sur un autre Forum :

        Function GetFraction(ByVal d As Decimal) As String
    
            'Get whole part of the number
            Dim Whole As Decimal = Math.Truncate(d)
    
            'each case has its return
            If d - Whole = 0 Then
                Return Whole.ToString
            Else
                Dim DecimalNbr As Integer = NumberOfDecimals(d)
                Dim DecimalPart As Integer = CInt((d - Math.Truncate(d)) * Math.Pow(10, DecimalNbr))
    
    
    
                ' Use the Euclidean algorithm to find the gcd
                Dim a As Int32 = DecimalPart
                Dim b As Int32 = CInt(Math.Pow(10, DecimalNbr))
                Dim t As Int32 = 0
    
                ' Euclidean algorithm
                While b <> 0
                    t = b
                    b = a Mod b
                    a = t
                End While
    
                ' Return our answer
                Return (Whole & " " & (DecimalPart / a) & "/" & (CInt(Math.Pow(10, DecimalNbr)) / a)).ToString
            End If
    
        End Function
    
    
        Private Function Frac(d As Decimal) As Decimal
            d = Math.Abs(d)
            Return d - Math.Truncate(d)
        End Function
        Private Function NumberOfDecimals(x As Decimal) As Integer
            x = Math.Abs(x)
            Dim nPlaces = 0
    
            While Frac(x) > 0
                x = x * 10D
                nPlaces += 1
            End While
    
            Return nPlaces
    
        End Function

    mardi 5 juillet 2016 21:16

Toutes les réponses

  • Bonjour Lambert,

    Essaie plutôt avec une condition tout au début qui recherche le "." ou la ",".

    Du style :

    If Instr(Ton nombre , ",") =0 then   'Instr va rechercher dans ton nombre la position de "," (0= s'il ne le trouve pas)

          il t'affiche le nombre que tu as rentré

          else

          tu copies le code que tu as actuellement

    End if

    En gros si dans ton nombre il n'y a le "." ou "," , il te renvoie simplement le nombre, sinon il effectue ta commande actuelle.

    Cdlt


    • Modifié AsIaM237 dimanche 3 juillet 2016 10:56
    dimanche 3 juillet 2016 10:56
  • Merci pour la réponse mais...

    J'ai essayé ce genre de condition mais elle me renvoie QUE les entiers et ce même si je tape 20.125, avec cette condition ca écrit 20 seulement ??

    dimanche 3 juillet 2016 13:41
  • Non ça écrit 20 uniquement si tu a écrit 20.

    Si tu mets 20.125, tu aura 20 1/8.

    Fais-le et redis moi. T'as juste 3 lignes à ajouter au code que tu as récupéré sur internet!!!

    lundi 4 juillet 2016 07:40
  • Désolé d'être imbécile mais j'ai essayer et ca ne me donne que des entiers et ce meme si je tape 3.625 ca écris 3

        Function GetFraction(ByVal d As Double) As String
            'TRANSFERE LES POUCES DÉCIMAL EN FRACTIONAL (Code pris sur le net ! )
    
            ' Get the initial denominator: 1 * (10 ^ decimal portion length)
            Dim Denom As Int32 = CInt(1 * (10 ^ d.ToString.Split(","c)(1).Length))
    
            ' Get the initial numerator: integer portion of the number
            Dim Numer As Int32 = CInt(d.ToString.Split(","c)(1))
    
    
            ' Use the Euclidean algorithm to find the gcd
            Dim a As Int32 = Numer
            Dim b As Int32 = Denom
            Dim t As Int32 = 0 ' t is a value holder
    
            ' Euclidean algorithm
            While b <> 0
                t = b
                b = a Mod b
                a = t
            End While
    
            'Get whole part of the number
            Dim Whole As String = d.ToString.Split(","c)(0)
    
            If InStr(Whole, ","c) = 0 Then
    
                Return Whole
            Else
    
                ' Return our answer
                Return Whole & " " & (Numer / a) & "/" & (Denom / a)
    
            End If
        End Function

    mardi 5 juillet 2016 01:29
  • Ton "if" justement tu le mets au tout début!!! Pour dire si ton nombre n'a pas de partie décimale il te renvoie direct la valeur que tu as entrée!!! Il n'aura pas besoin de calculer Whole, Numer, Denom.... Tout ce qu'il aura à faire c'est te renvoyer la valeur que tu as saisie, et ensuite "else" donc s'il détecte la partie décimale, tu coles le code que tu as copié sur internet qui marchait déjà pour les nombre avec virgule!!!

    Le bout de code que tu dois ajouter doit se faire au tou début, juste pour détecter la présence ou non de la virgule dans la valeur saisie dans le textbox!!!


    AsIaM237


    • Modifié AsIaM237 lundi 18 juillet 2016 12:51
    mardi 5 juillet 2016 08:08
  • En ça te donne uniquement les entiers parce-que le "whole" correspond à la partie entière que tu as déjà extraite de ton nombre et donc il n'y trouvera jamais de virgule et te le renverra à chaque fois!!!


    AsIaM237


    • Modifié AsIaM237 lundi 18 juillet 2016 12:51
    mardi 5 juillet 2016 08:19
  • Bon je n'ai plus d'erreurs mais je n'ai que des 0 dans mon tableau !!

        Function GetFraction(ByVal d As Double) As String
    
            Dim Entier As Single
    
            If InStr(Entier, ",") = 0 Then
    
                Return Entier
            Else
                'TRANSFERE LES POUCES DÉCIMAL EN FRACTIONAL (Code pris sur le net ! )
    
                ' Get the initial denominator: 1 * (10 ^ decimal portion length)
                Dim Denom As Int32 = CInt(1 * (10 ^ d.ToString.Split(","c)(1).Length))
    
                ' Get the initial numerator: integer portion of the number
                Dim Numer As Int32 = CInt(d.ToString.Split(","c)(1))
    
    
                ' Use the Euclidean algorithm to find the gcd
                Dim a As Int32 = Numer
                Dim b As Int32 = Denom
                Dim t As Int32 = 0 ' t is a value holder
    
                ' Euclidean algorithm
                While b <> 0
                    t = b
                    b = a Mod b
                    a = t
                End While
    
                'Get whole part of the number
                Dim Whole As String = d.ToString.Split(","c)(0)
    
                ' Return our answer
                Return Whole & " " & (Numer / a) & "/" & (Denom / a)
    
            End If
        End Function

    Je ne comprends pas très bien les Fonction apparemment :)

    mardi 5 juillet 2016 21:08
  • J'ai trouvé mon bonheur sur un autre Forum :

        Function GetFraction(ByVal d As Decimal) As String
    
            'Get whole part of the number
            Dim Whole As Decimal = Math.Truncate(d)
    
            'each case has its return
            If d - Whole = 0 Then
                Return Whole.ToString
            Else
                Dim DecimalNbr As Integer = NumberOfDecimals(d)
                Dim DecimalPart As Integer = CInt((d - Math.Truncate(d)) * Math.Pow(10, DecimalNbr))
    
    
    
                ' Use the Euclidean algorithm to find the gcd
                Dim a As Int32 = DecimalPart
                Dim b As Int32 = CInt(Math.Pow(10, DecimalNbr))
                Dim t As Int32 = 0
    
                ' Euclidean algorithm
                While b <> 0
                    t = b
                    b = a Mod b
                    a = t
                End While
    
                ' Return our answer
                Return (Whole & " " & (DecimalPart / a) & "/" & (CInt(Math.Pow(10, DecimalNbr)) / a)).ToString
            End If
    
        End Function
    
    
        Private Function Frac(d As Decimal) As Decimal
            d = Math.Abs(d)
            Return d - Math.Truncate(d)
        End Function
        Private Function NumberOfDecimals(x As Decimal) As Integer
            x = Math.Abs(x)
            Dim nPlaces = 0
    
            While Frac(x) > 0
                x = x * 10D
                nPlaces += 1
            End While
    
            Return nPlaces
    
        End Function

    mardi 5 juillet 2016 21:16