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.NET Discussion :

Formater et supprimer la virgule d'un montant dans une datagridview ( GetFormatNumber )


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2012
    Messages : 36
    Par défaut Formater et supprimer la virgule d'un montant dans une datagridview ( GetFormatNumber )
    bonjour,

    j'utilise cet fonction et après plusieurs issue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Function GetFormatNumber(ByVal a As String) As String
           Dim b = ""
           For Each c As Char In a.ToCharArray
               If Char.IsNumber(c) Then b &= c
           Next
           Return CULng(b).ToString("D13")
       End Function
    pour formater et supprimer la virgule d'un montant dans une datagridview et sauvegarder dans un fichiers texte en 13 positions
    par exemple
    18622,77 il deviendra 0000001862277 ca marche très bien
    mais quand le chiffre après la virgule 00, 10 , 20 ,30 , 40, 50, 60, 70, 80, 90 il deviendra comme çà
    18622,00 il deviendra 0000000018622 normalement c'est comme çà 0000001862200
    18622,70 il deviendra 0000000018627 normalement c'est comme çà 0000001862270

    et merci beaucoup

  2. #2
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonjour,

    Vu que ce que tu places dans le DataGridView est C4 calculé par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C4 = (CType(Uneligne.Substring(8, 13), Integer) / 100).ToString
    je te propose de remplacer ta fonction GetFormatNumber par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Private Function GetFormatNumber(ByVal Nombre As String, ByVal Longueur As Integer) As String 'Longueur = nombre de caractères de la chaine renvoyée
            Dim s As String
            s = (CType(Nombre, Single) * 100).ToString
            Return s.PadLeft(Longueur, "0"c)
        End Function
    Ceci devrait te convenir ...

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2012
    Messages : 36
    Par défaut
    bonjour et merci pour votre réponse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SW.Write(C2 & "" & C3 & "" & GetFormatNumber(C4) & "" & C1)
    quand j'ai remplacé ma fonction j'ai reçu ce message
    argument not specified for parameter 'Longueur' of private function GetFormatNumber

  4. #4
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Mais oui ...

    Corrige ta ligne de code comme te l'indique le message d'erreur, c'est-à-dire comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SW.Write(C2 & "" & C3 & "" & GetFormatNumber(C4, 13) & "" & C1)
    J'ai ajouté ce paramètre à la fonction pour que tu puisses l'utiliser avec d’autres longueurs de chaines.

    Bonne journée,

  5. #5
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2012
    Messages : 36
    Par défaut
    bonjour et merci
    j'ai corrigé la ligne de code
    pour le montant 124587,40
    le resulta et

    1245799901,245874E+07azouz benali

  6. #6
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Pourtant, j'ai testé la fonction. Le problème est ailleurs ...

    Envoie-moi les codes de la fonction (comme elle se trouve dans ton programme), les codes de lecture du fichier et chargement du DataGrid, ainsi que tes codes d'écriture du fichier.
    Notamment, je veux voir comment la donnée passe du DataGrid à la variable C4.

    Avant de m'envoyer tes codes, veux-tu bien encore essayer une modification de ma fonction, comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Private Function GetFormatNumber(ByVal Nombre As String, ByVal Longueur As Integer) As String 'Longueur = nombre de caractère de la chaine renvoyée
            Dim s As String
            s = String.Format("{0:###,.##}", (CType(Nombre, Single) * 100).ToString)
            Return s.PadLeft(Longueur, "0"c)
        End Function
    ...

  7. #7
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2012
    Messages : 36
    Par défaut
    merci phil rob
    le même problème

    11245892960000001258777eloukbi touati montant en datagridview =12587,77 juste
    458179549301,245874E+07boulali times montant en datagridview = 124587,40 faux
    45789427990000007878921ali touati montant en datagridview = 78789,20 faux
    025587491201,257893E+07djouni reree montant en datagridview = 125987,33 faux
    01245188330000005487800dahmouni kamal montant en datagridview = 54878,00 juste
    05480079870000000012410kalil benamara montant en datagridview = 124,10 juste

  8. #8
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    OK, il faut donc que tu m'envoies tous les codes qui impliquent ces valeurs :
    1. la fonction telle qu'elle se trouve dans ton application
    2. lecture du DatadGridView et écriture fichier
    3. lecture fichier et affectation du DataGridView

    Mais avant cela, vérifie dans ton fichier (avec NotePad) que les valeurs y sont correctes : il se peut que certaines valeurs aient été "abimées" et que maintenant tu ne peux plus les relire correctement même avec la bonne fonction.

    Tu peux, si tu veux, faire un ZIP de l'application (si rien de confidentiel ...).

    J'aurai du temps demain matin ...

    Bonne soirée,

  9. #9
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonjour,

    Les longueurs de chaines dans le fichier ne sont plus les mêmes que celles qui ont servi à mes tests.

    La première ligne de mon fichier de test est :

    124579990000002544433azouz benali
    c'est-à-dire
    12457999 compte + clé = 8 car. (6 car. + 2 car.)
    0000002544433 montant 13 car.
    et le nom, autant de caractère jusqu'à fin de ligne.

    La première ligne que tu envoies hier à 17h23 est :

    11245892960000001258777eloukbi touati
    c'est-à-dire
    1124589296 compte + clé = 10 car. (8 car. + 2 car.) ?
    0000001258777 montant 13 car.
    et le nom, autant de caractère jusqu'à fin de ligne.

    Il y a donc 2 car. de plus pour le numéro de compte et la clé. C'est ça le problème !


    Il te faut corriger les lignes lectures comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                C2 = Uneligne.Substring(0, 8)
                C3 = Uneligne.Substring(8, 2)
                C4 = (CType(Uneligne.Substring(10, 13), Integer) / 100).ToString
                MessageBox.Show(C2 & " " & C3 & " " & C4 & " " & C1 & " ... " & GetFormatNumber(C4, 13)) ' pour test
                C1 = Uneligne.Substring(23)
    Attention, tu dois vérifier si ton fichier n'a été déformé par de mauvais enregistrements et tu dois vérifier aussi si ta procédure d'écriture du fichier est bonne pour ce formatage. En effet, je me suis basé sur ton exemple (124579990000002544433azouz benali) pour écrire mon fichier de test et donc cela devait être le format à cette époque ... Et puis, plusieurs codes ont été produits depuis le début et tout à coup, ça ne marche plus ... et la fonction GetFormatNumber n'y est pour rien : c'est d'abord la tienne qui ne fonctionne plus, puis c'est ma première, et puis la suivante ...

    A tantôt,

  10. #10
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2012
    Messages : 36
    Par défaut
    bonjour phil rob et merci pour votre aide
    C'est vrai j'ai changé le Ncompte a 08 position et le cle 02 mais je suis toujours en train de modifier sur un projet (niveau débutant)
    Le problème et toujours c'est que je n'ai pas trouvé la fonctions qui permettent de passer formatage de du montant en 13 position sans erreur dans le fichier .txt
    parce que la fonction de formatage que j'ai essayé fonctionne mal dans tous les test que j'ai fais
    et sur tout avec le chiffres après la virgule dans le cas de 00 ou 10 ….
    ou avec les grand montant et dans le création du fichiers txt
    le code lire fichiers ca marche très bien avec succès

    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
    54
    55
    'import datagridview
     Private Sub ShowdDataGView()
            cn.Open()
            cmd.CommandText =
            <sql>
                        SELECT 
                            *                     
                        FROM 
                            EmpCcp;
                    </sql>.Value
            Dtr = cmd.ExecuteReader
            Dim I As Integer
            For I = 0 To MyTbl.Rows.Count - 1
                Dtr.Read()
            Next
            MyTbl.Load(Dtr)
            DGView.DataSource = MyTbl
            ImportDG()
            DGView.Refresh()
            Dtr.Close()
            cn.Close()
        End Sub
    	Private Function GetFormatNumber(ByVal Nombre As String, ByVal Longueur As Integer) As String 'Longueur = nombre de caractère de la chaine renvoyée
            Dim s As String
            s = String.Format("{0:###,.##}", (CType(Nombre, Single) * 100).ToString)
            Return s.PadLeft(Longueur, "0"c)
        End Function
     'creation du fichiers texte
     Using Savefile As New SaveFileDialog
                Dim nowYear As Integer = Date.Now.Year
                Dim Nconting, RIB, CDord, NMondat, nowmonth As String
                nowmonth = (maTextBox.Text.ToString().PadLeft(2, "0"))
                NMondat = (TextBox3.Text.ToString().PadLeft(6, "0"))
                CDord = (TextBox2.Text.ToString().PadLeft(8, "0"))
                RIB = (TextBox1.Text.ToString().PadLeft(20, "0"))
                Nconting = (DGView.RowCount.ToString().PadLeft(7, "0"))
                Savefile.FileName = (CDord & "_" & NMondat & "_" & nowYear.ToString & ".txt")
                Savefile.Filter = "fichier TXT (*.txt)|*.txt|Tous les fichier (*.*)|*.*"
                If Savefile.ShowDialog = Windows.Forms.DialogResult.OK Then
                    Dim SW As New System.IO.StreamWriter(Savefile.FileName)
                    Dim total = (From x As DataGridViewRow In DGView.Rows Select CDbl(x.Cells(4).Value)).Sum
                    SW.WriteLine(RIB & "" & GetFormatNumber(total, 13) & "" & Nconting & "" & nowmonth.ToString & "" & nowYear.ToString & "" & CDord & "" & NMondat)
                    Dim C1, C2, C3, C4 As String
                    For i As Integer = 0 To DGView.Rows.Count - 1
                        C2 = (DGView.Rows(i).Cells(2).Value.ToString().PadLeft(8, "0") & "")
                        C3 = (DGView.Rows(i).Cells(3).Value.ToString() & "")
                        C4 = (DGView.Rows(i).Cells(4).Value.ToString() & "")
                        C1 = (DGView.Rows(i).Cells(1).Value.ToString().PadRight(27))
                        SW.Write(C2 & "" & C3 & "" & GetFormatNumber(C4, 13) & "" & C1)
                        SW.WriteLine("")
                    Next
                    SW.Close()
                    MessageBox.Show("avec succes")
                End If
            End Using

  11. #11
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    OK, je vais regarder ce que je peux faire avec les codes que tu m'envoies.

    Mais soit sûr, ce n'est pas le formatage du montant qui pose le problème.
    Le problème vient du fait qu'on ne lit pas la chaine de chiffre à partir de la bonne position.
    Dans le compte sur 8 au lieu de 6, les chiffres lu pour le montant contiennent aussi la clé, ce qui fait un très grand nombre (9800000012345).
    Et si on lit le fichier avec le compte sur 6, après avoir corrigé le code pour compte sur 8, les chiffres lu pour le montant contiennent aussi les 2 premiers caractères du nom, ce qui fait un nombre aberrant (000012345Am).
    Bref, il faut lire-écrire le bon fichier avec le bon format programmé.

    Je vais travailler sur le format 6 + 2 + 13 + LongNom (la longueur du nom n'a pas d'importance, c'est le reste de la ligne).

    Question :
    Ne peux-tu écrire une information par ligne dans le fichier ? Tu n'aurais plus de problème de format, ni en lecture, ni en écriture.
    Chaque enregistrement (du point de vue de l'utilisateur) serait en réalité composé de 4 lignes et s'obtiendrait par 4 ReadLine consécutifs.
    L'écriture du fichier se ferait par 4 WriteLine consécutifs.
    Tu ne devrais plus faire de conversion de format pour les montants, ils seraient enregistrés tels que présentés dans le DGView.
    Et si dans l'avenir, les longueurs de comptes changent encore, ça ne poserait aucun problème, tu ne devrais pas modifier ton code.

    Lecture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
                C2 = FichierEntree.ReadLine()
                C3 = FichierEntree.ReadLine()
                C4 = FichierEntree.ReadLine()
                C1 = FichierEntree.ReadLine()
     
    ' ou mieux encore :
     
                 DGView.Rows(i).Cells(2).Value.ToString())   = FichierEntree.ReadLine()  ' C2
                 DGView.Rows(i).Cells(3).Value.ToString())   = FichierEntree.ReadLine()  ' C3
                 DGView.Rows(i).Cells(4).Value.ToString())   = FichierEntree.ReadLine()  ' C4
                 DGView.Rows(i).Cells(1).Value.ToString())   = FichierEntree.ReadLine()  ' C1
    Ecriture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                 SW.WriteLine(DGView.Rows(i).Cells(2).Value.ToString())   ' C2
                 SW.WriteLine(DGView.Rows(i).Cells(3).Value.ToString())   ' C3
                 SW.WriteLine(DGView.Rows(i).Cells(4).Value.ToString())   ' C4
                 SW.WriteLine(DGView.Rows(i).Cells(1).Value.ToString())   ' C1
    Sauf si tu m'informes que tu veux bien effectivement passer au mode 4 lecture/4 écriture, je vais tenter de faire un modèle de programme en utilisant tes codes.

    Je viens de t'envoyer ce message par mail privé. Cela m'arrangerait que tu y répondes ...

    A tantôt,

  12. #12
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Voici donc le fichier Ahmed.zip (Ahmed.zip) qui contient l'application de test.
    Je n'ai pas pu y laisser la video parce que fichier dépasse alors le volume autorisé sur le forum.
    J'ai placé la video sur Dropbox, voici le lien : https://www.dropbox.com/s/2mdml3rcym...Ahmed.mp4?dl=0

    J'espère que tout ceci t'aura aidé ...

  13. #13
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Pour le problème du format scientifique dans le TXT, il suffit de modifier une ligne dans la fonction GetFormatNumber et travailler avec Double au lieu de Single : s = (CType(Nombre, Double) * 100).ToString.
    Cependant, j'ai apporté quelques formatages d'affichage dans le DGView pour afficher correctement les nombres avec 1 seule décimale et ceux sans décimale : 123.10 ou 123.00. Sans ce formatage, il affiche 123.1 ou 123 dans le DGView.
    Je te renvoie donc le dossier complet : Ahmed.zip
    ...

  14. #14
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2012
    Messages : 36
    Par défaut
    Merci beaucoup phil rob de ton aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Supprimé les espaces et les '\n' dans une chaine
    Par EricStib dans le forum Général Python
    Réponses: 6
    Dernier message: 04/01/2009, 18h02
  2. [MySQL] Supprimer la répitition des résultats identiques dans une liste déroulante
    Par ghyosmik dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 13/03/2008, 17h33
  3. retirer la virgule d'un nombre dans une concaténation
    Par Bernard123 dans le forum Excel
    Réponses: 1
    Dernier message: 23/10/2007, 14h45
  4. supprimer un item d'un jcombobox dans une jtable
    Par bellout dans le forum Composants
    Réponses: 6
    Dernier message: 22/06/2006, 16h06
  5. supprimer le contenu d'un champ dans une table paradox
    Par ouldfella dans le forum Bases de données
    Réponses: 1
    Dernier message: 19/04/2006, 13h24

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