IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

Problème avec la conversion d'un string et son utilisation dans des calculs mathématiques


Sujet :

VB 6 et antérieur

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Janvier 2007
    Messages : 89
    Points : 46
    Points
    46
    Par défaut Problème avec la conversion d'un string et son utilisation dans des calculs mathématiques
    Bjr;
    j'ai passé plusieurs jours à essayer de résoudre ce pb seule mais en veine c'est pourquoi je fais appel à votre aide
    voilà j'ai un string "9999900008015281"
    que je doit multiplier par 100
    puis calculer son modulo au nombre 97
    puis le nombre moins le modulo
    le pb c'est quelque soit la conversion CDbl, Cint u autre je tombe sur un chiffre du genre ....E+15
    ce qui me donne un résultat faux merci à l'avance pour votre aide et excuser mon ignorance(j'ai jamais travailler avec vb6)

  2. #2
    Membre éprouvé Avatar de DAUDET78
    Homme Profil pro
    retraité
    Inscrit en
    Janvier 2008
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 81
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 634
    Points : 1 161
    Points
    1 161
    Par défaut
    Citation Envoyé par tinhinan6 Voir le message
    et excuser mon ignorance(j'ai jamais travailler avec vb6)
    Ce n'est pas un problème de VB6 ..... mais de tous les langages de programmation qui ont une limite sur la taille maximum d'un entier. Sinon, il passe en flottant
    sur un chiffre du genre ....E+15
    En VB6 tu as le type Currency Entier qui pourrait être une piste. Sinon, c'est un problème mathématique qui consiste à scinder "9999900008015281" en "9999900" et "008015281" qui sont stockables sur deux variables de type Entier Long et ensuite, faire la cuisine pour calculer le modulo

  3. #3
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 174
    Points
    17 174
    Par défaut
    Salut

    A vérifier avec diffèrent chiffres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim Chiffre As String
    Chiffre = "9999900008015281"
    MsgBox Round(((CDec(Chiffre) * 100) / 97), 0)
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  4. #4
    Membre expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Points : 3 685
    Points
    3 685
    Par défaut
    Bonjour,

    sauf erreur de ma part, le code de ProgElect ne fonctionne pas pour des nombres plus importants (Salut au passage )

    Voila un code "un peu" tordu, pas documenté, mais qui doit te donner le résultat attendu :

    Il te faut 2 zones text, dans la première tu mets ton nombre (9999900008015281 dans ton exemple), dans la deuxième le nombre par lequel tu divises (97 dans ton exemple)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    Private Sub Command1_Click()
    Dim Div As Integer
    Dim TempoGrp As String
    Dim TempoMod As Double
    Dim MaValeur As String
    Dim Longueur As Integer
    Dim LongueurModulo As Integer
    Dim i As Integer, j As Integer
    Dim TempoVal As String
     
    Div = Val(Text2.Text)
     
    MaValeur = Text1.Text
    Do
      i = i + 1
      Longueur = Len(Text2.Text)
      TempoGrp = Mid(MaValeur, i, Longueur)
      If Val(TempoGrp) < Div Then
        Longueur = Longueur + 1
        TempoGrp = Mid(MaValeur, i, Longueur)
      End If
     
      TempoMod = Val(TempoGrp) Mod Div
     
      LongueurModulo = Len(Trim(Str(TempoMod)))
      TempoGrp = Trim(Str(TempoMod))
      TempoVal = ""
      For j = 0 To i - 2
        TempoVal = TempoVal & "0"
      Next j
      For j = 1 To (Longueur - LongueurModulo)
        TempoVal = TempoVal & "0"
      Next j
      TempoVal = TempoVal & Trim(Str(TempoMod))
      TempoVal = TempoVal & Mid(MaValeur, i + Longueur)
      MaValeur = TempoVal
    Loop Until Val(MaValeur) < Div
     
    Debug.Print "Modulo final : " & Val(MaValeur)
    i = 0
    Do
      i = i + 1
      TempoGrp = Right(Text1.Text, i)
    Loop Until Val(TempoGrp) >= Div
    TempoGrp = Trim(Str(Val(TempoGrp) - Val(MaValeur)))
    TempoVal = Left(Text1.Text, Len(Text1.Text) - i)
    For j = 1 To i - Len(TempoGrp)
      TempoVal = TempoVal & "0"
    Next j
    TempoVal = TempoVal & TempoGrp
    Debug.Print "partie entière : " & TempoVal
     
    End Sub
    J'ai fait quelques essais, ça semble fonctionner (à vérifier tout de même).
    Pour VB6 : N'oubliez pas d'aller voir la FAQ et les Tutoriels
    Vous trouvez une reponse particulierement utile ? Votez pour !

  5. #5
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 174
    Points
    17 174
    Par défaut
    Salut

    OhMonBato tu me connais, je ne suis pas du tout ennuyé de ta remarque, mais je ne suis pas d'accord, il est possible que nous n'ayons pas compris le même besoin de calcul formulé par tinhinan6.

    Il est possible aussi que je n'ai pas su faire fonctionné ton code.

    Ce que j'ai compris Résultat = partie entière d'un (chiffre multiplié par 100) divisé par un autre chiffre.


    Donc je persiste avec une (peut être) amélioration.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim Chiffre As String
    Dim Diviseur As Integer
    Dim Multipl As Integer
     
    Chiffre = "779919999999919919999999998" ' maximum
    Multipl = 100
    Diviseur = 97
    On Error Resume Next
    MsgBox CDec(Left$(CStr(CDec((CDec(Chiffre) * Multipl) / Diviseur)), (InStr(1, CStr(CDec((CDec(Chiffre) * Multipl) / Diviseur)), ",", vbTextCompare) - 1)))
    If Err.Number <> 0 Then
        MsgBox "Erreur n° " & Err.Number & vbNewLine & Err.Description, vbCritical
    End If
    Avec Chiffre = "9999900008015287"
    Multipl = 100
    Diviseur = 91
    Ma premiére proposition donnait: 10988901107709107
    La derniére proposition donne: ... 10988901107709106
    En effet, Round(Chiffre,0) arrondi à l'unité supérieure si la décimal => à 0.5
    C'est pourquoi la nouvelle formule supprime tous les caractères de droite compris le séparateur décimal.

    ATTENTION: Chiffre doit être <= 779 919 999 999 919 919 999 999 998
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  6. #6
    Membre expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Points : 3 685
    Points
    3 685
    Par défaut
    Alors on a peut être pas compris la même chose.

    Si je prends un exemple simple, je pensais qu'avec le nombre 97 et le diviseur 13, on voulait 6 et 91 comme résultat (7*13 = 91, reste 6). J'oublie la multiplication par 100 qui "ne sert à rien" ou alors toujours avec les mêmes nombres on obtient 2 et 9698 (746 * 13). C'est pas ça le résultat attendu ?
    Pour VB6 : N'oubliez pas d'aller voir la FAQ et les Tutoriels
    Vous trouvez une reponse particulierement utile ? Votez pour !

  7. #7
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Bonjour,
    L'opérateur \ est effectivement limité aux longs et l'expression d'un nombre autre qu'au format décimal (Cdec(variant))
    retournera une expression au format scientifique.
    Concernant l'opération voulue, je n'ai pas du non plus comprendre car pour moi c'était :
    value - Mod (100 * value, 97) soit avec la librairie VB6i
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SubZ(value, ModuloZ(MultZ(value, "100"), "97")) '= 9999900008015276
    Mais comme de toute manière il semble que l'initiateur de la file s'en tape lol

Discussions similaires

  1. Problème avec la conversion du DateTime
    Par Dr.SoFtNaF dans le forum Développement
    Réponses: 7
    Dernier message: 15/09/2010, 11h24
  2. Probléme de la conversion au type string
    Par chahinaz21 dans le forum VB.NET
    Réponses: 1
    Dernier message: 07/11/2009, 21h39
  3. problème avec une variable de type string
    Par marsupilami34 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 14/06/2007, 14h53
  4. Problème avec StingTokenizer vers tableau de String
    Par nicofromChina dans le forum Collection et Stream
    Réponses: 9
    Dernier message: 06/10/2006, 11h22
  5. Problème avec RegEx et une Query string
    Par Erakis dans le forum Langage
    Réponses: 6
    Dernier message: 08/11/2005, 15h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo