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

C# Discussion :

Conversion en lettre et erreur de conversion


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Par défaut Conversion en lettre et erreur de conversion
    Bonjour, j'ai une fonction que j'ai trouvé sur google toute prête qui traduit les chiffres en lettre tout se passe tres bien sauf pour un dossier dont le montant a convertir est vide, j'ai pu identifier la ligne de l'erreur mais je n'arrive pas à comprendre c'est quoi l'erreur, veuillez m'aider :

    Appel de la fonction valeur a convertir 632696.4
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    try
                {
                    double estimation = Convert.ToDouble(dt.Rows[0]["Estimation"]);
     
                    string estimationLettre = toWord.NumberConverted(estimation);
                    dt.Rows[0]["montantL"] = estimationLettre[0].ToString().ToUpper() + estimationLettre.Substring(1).ToLower();
     
                }
                catch (Exception ex)
                {
                    dt.Rows[0]["montantL"] = String.Empty;                
                }
    La fonction :
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    public string NumberConverted(double Number)
            {
                string integerLetter = "", decimalLetter = "", FormattedLetter = "";
                int intergerValue = 0, decimalValue = 0;
     
                char separateur = '.';
     
                if(Number.ToString().Contains(','))
                    separateur=',';
     
                String[] splits = Number.ToString().Split(separateur);
     
                intergerValue = Convert.ToInt32(splits[0]);
     
                if (splits.Length > 1) //get decimal value
                {
                    string decimalPart = splits[1];
     
     
                    int partPrecision = 2;
                    string result = String.Empty;
     
                    if (partPrecision != decimalPart.Length)
                    {
                        int decimalPartLength = decimalPart.Length;
     
                        for (int i = 0; i < partPrecision - decimalPartLength; i++)
                        {
                            decimalPart += "0"; //Fix for 1 number after decimal ( 10.5 , 1442.2 , 375.4 ) 
                        }
     
                        result = String.Format("{0}.{1}", decimalPart.Substring(0, partPrecision), decimalPart.Substring(partPrecision, decimalPart.Length - partPrecision));
     
                        try
                        {
                            result = (Math.Round(Convert.ToDecimal(result))).ToString(); l'erreur est la result contient 40 avant le round mais au moment du rount il iffiche format chaine 
    incorrecte                    }
                        catch (Exception ex)
                        {
                            MessageBox.Show("Test sur poste client result round " + result, "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            MessageBox.Show("Test sur poste client ex " + ex.Message, "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                    }
                    else
                        result = decimalPart;
     
                    for (int i = 0; i < partPrecision - result.Length; i++)
                    {
                        result += "0";
                    }
                    MessageBox.Show("Test sur poste client decimalValue result" + decimalValue, "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
     
                    decimalValue = Convert.ToInt32(result);
     
                }
                #region integerValue
     
                if (intergerValue != 0)
                {
                    integerLetter = convertir(intergerValue);
                }
     
                #endregion
     
                #region decimalvalue
     
                if (decimalValue != 0)
                {
                    decimalLetter = convertir(decimalValue);
                }
     
                #endregion
     
                if ((decimalValue != 0 && intergerValue != 0))
                    FormattedLetter = integerLetter + " Dirhams et " + decimalLetter + " Centimes";
     
                if ((decimalValue == 0 && intergerValue != 0))
                    FormattedLetter = integerLetter + " Dirhams";
     
                if ((decimalValue == 0 && intergerValue == 0))
                    FormattedLetter = "Zéro Dirhams";
     
                if (FormattedLetter.StartsWith("un mille") || FormattedLetter.StartsWith("Un mille"))
                    FormattedLetter = FormattedLetter.Substring(3);
     
                return FormattedLetter;
            }

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Bonjour,

    Un rapide coup d'oeil sur le code dont je ne comprends pas vraiment le sens d'ailleurs, montre que la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result = String.Format("{0}.{1}", decimalPart.Substring(0, partPrecision), decimalPart.Substring(partPrecision, decimalPart.Length - partPrecision));
    introduit un "." dans la chaine result. La chaine result ne contient donc pas "40" mais "40."
    La conversion en decimal de 40. génère une exception.

  3. #3
    Membre éprouvé
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Par défaut
    il s'agit d'une fonction qui traduit les chiffres en lettre

    meme si ca donne 40. ca passe chez moi mais sur les postes clients ca ne marches pas

    MEME SI j'enleve le point ca ne passe pas, une idée ?

  4. #4
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    3 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 006
    Par défaut
    De ce que j'ai pu comprendre cette routine convertit un double en string puis sépare la partie entière et la partie décimale pour ensuite les réunir après avoir rajouté des zéro derrière la deuxième décimale.
    Pourquoi faire si compliqué alors que la méthode ToString du type double te permet de spécifier un format ?

    Qu'est sensée faire cette routine exactement ?
    C'est à dire qu'est ce que tu as en entrée et que cherches tu à obtenir en sortie ?
    Une fois qu'on aura ces éléments, il sera plus facile de te donner une réponse.

  5. #5
    Membre éprouvé
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Par défaut
    Qui'est sensée faire cette routine exactement ?
    des utilisateurs qui travaille sur des montant en DH et centime
    C'est à dire qu'est ce que tu as en entrée et que cherches tu à obtenir en sortie ?
    dans une interface form, j'introduit dans une zone de texte un chiffre (montant en DHs) et j'appelle cette fonction pour me le retourner en lettre (Montant en dirham en lettre)
    Une fois qu'on aura ces éléments, il sera plus facile de te donner une réponse.

  6. #6
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    3 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 006
    Par défaut
    S'il s'agit simplement de traduire un chiffre en lettre avec monnaie, tu devrais regarder la librairie DVP.Net (il y a même un package Nuget).

    Et ça donne ce code très simple :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var desc = new Developpez.Dotnet.Language.CurrencyDescriptor()
    {
        CurrencyName = "dirham",
        PluralCurrencyName = "dirhams",
        CurrencySymbol = "DH",
        CurrencyGender = Developpez.Dotnet.Language.Grammar.Gender.Masculine,
        CentsName = "centime",
        PluralCentsName = "centimes",
        CentsGender = Developpez.Dotnet.Language.Grammar.Gender.Masculine
    };
     
    MessageBox.Show(Developpez.Dotnet.NumberConverter.SpellAmount(185.78, desc));

    Résultat obtenu :
    cent quatre-vingt-cinq dirhams et soixante-dix-huit centimes

Discussions similaires

  1. Erreur de conversion
    Par HULK dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 06/09/2005, 11h14
  2. Erreur de conversion
    Par franculo_caoulene dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 01/08/2005, 16h23
  3. Erreur de conversion et requête dynamique dans une procédure
    Par franculo_caoulene dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 01/08/2005, 15h12
  4. Erreur de conversion de type Null en String
    Par navis84 dans le forum Bases de données
    Réponses: 3
    Dernier message: 26/07/2005, 15h25
  5. Erreur de conversion int to socklen_t
    Par def_jam_vendetta dans le forum C++
    Réponses: 6
    Dernier message: 04/03/2005, 10h53

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