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 :

Comportement bizarre de Decimal.ToString


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    3 001
    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 001
    Par défaut Comportement bizarre de Decimal.ToString
    Bonjour,

    Suivant la documentation MSDN.
    Lorsque le format contient un dièse (#) à une position, il doit y avoir soit le digit existant à cette position, soit rien du tout (dans le cas où le digit est zéro ou qu'il n'y a rien à cette position).

    Pourtant avec le format "### ### ##0.00" et la valeur 12345, j'obtiens " 12345,00" et non pas "12345,00" comme je m'y attendais

    J'ai essayé les manière suivantes :
    number.ToString(format, CultureInfo.CreateSpecificCulture("fr-FR")) => " 12345,00"
    number.ToString(format, CultureInfo.CurrentCulture) => " 12345,00"
    number.ToString(format, CultureInfo.InvariantCulture) => " 12345.00"
    number.ToString(format, NumberFormatInfo.InvariantInfo) => " 12345.00"
    number.ToString(format) => " 12345,00"

    Est-ce que j'ai mal compris la documentation ?
    Est-ce un bug du Framework (je suis en 4.5.2) ?

    Je peux bien évidemment faire un Trim() sur le résultat (c'est d'ailleurs ce que j'ai fait pour palier rapidement au problème).
    Cependant j'aimerais comprendre pourquoi j'ai ce résultat (pour ma culture personnelle).

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    3 001
    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 001
    Par défaut
    Bonjour,

    En fait j'ai trouvé (ou du moins, je le pense alors reprenez moi si je me trompe).

    Cela vient du fait que mon chiffre est trop petit pour ce format.
    Avec le format "### ##0.00" ou un chiffre supérieur ou égal au million, ça passe.

    Si c'est un comportement normal, c'est bien dommage car tout l'intérêt du format que j'avais était de palier à une plus grande quantité de cas.
    Là, ça signifie qu'il faut que j'adapte le format au nombre, ça me parait aberrant.

  3. #3
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Par défaut
    Citation Envoyé par popo Voir le message
    Est-ce que j'ai mal compris la documentation ?
    Est-ce un bug du Framework (je suis en 4.5.2) ?
    La documentation ne précise pas le comportement pour l'utilisation de l'espace en tant que séparateur des milliers.. Je ne pense pas que ce soit un bug non plus étant donné que tu précises bien que tu souhaites avoir un espace (par contre, en toutes logique, j'aurais imaginé que tu aurais deux espaces avant ton premier caractère).

    Pour répondre à ton besoin tu peux utiliser les formats de référence. Par contre le résultat dépendra de la culture. Ce qui, après tout, n'est pas trop déconnant étant donné que suivant ladite culture définit les standards d'affichage..

  4. #4
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    Pris d'un doute, j'ai fait un test, et je pense que tu fais erreur dès le départ. De mon côté, j'obtient " 12 345,00". Ce qui est le résultat attendu via le format que tu as spécifié.

    Maintenant, pourquoi ce résultat ? Il faut regarder le format que tu spécifies : ### ### ##0.00

    Voici avec l'exemple 12345 (je zape les décimales).
    • 1er # : est-ce que le nombre à 9 chiffres ? non, donc on n'affiche rien
    • 2e # : est-ce que le nombre à 8 chiffres ? non, donc on n'affiche rien
    • 3e # : est-ce que le nombre à 7 chiffres ? non, donc on n'affiche rien
    • on affiche un espace
    • 4e # : est-ce que le nombre à 6 chiffres ? non, donc on n'affiche rien
    • 5e # : est-ce que le nombre à 5 chiffres ? oui, donc on affiche 1 (le premier chiffre)
    • 6e # : est-ce que le nombre à 4 chiffres ? oui, donc on affiche 2 (le second chiffre)
    • on affiche un espace
    • 7e # : est-ce que le nombre à 3 chiffres ? oui, donc on affiche 3 (le troisième chiffre)
    • 8e # : est-ce que le nombre à 2 chiffres ? oui, donc on affiche 4 (le quatrième chiffre)
    • 9e # : est-ce que le nombre à 1 chiffres ? oui, donc on affiche 5 (le cinquième chiffre)


    Au final, on obtient donc " 12 345,00"

  5. #5
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    3 001
    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 001
    Par défaut
    Citation Envoyé par François DORIN Voir le message
    Pris d'un doute, j'ai fait un test, et je pense que tu fais erreur dès le départ. De mon côté, j'obtient " 12 345,00". Ce qui est le résultat attendu via le format que tu as spécifié.

    Maintenant, pourquoi ce résultat ? Il faut regarder le format que tu spécifies : ### ### ##0.00

    Voici avec l'exemple 12345 (je zape les décimales).
    • 1er # : est-ce que le nombre à 9 chiffres ? non, donc on n'affiche rien
    • 2e # : est-ce que le nombre à 8 chiffres ? non, donc on n'affiche rien
    • 3e # : est-ce que le nombre à 7 chiffres ? non, donc on n'affiche rien
    • on affiche un espace
    • 4e # : est-ce que le nombre à 6 chiffres ? non, donc on n'affiche rien
    • 5e # : est-ce que le nombre à 5 chiffres ? oui, donc on affiche 1 (le premier chiffre)
    • 6e # : est-ce que le nombre à 4 chiffres ? oui, donc on affiche 2 (le second chiffre)
    • on affiche un espace
    • 7e # : est-ce que le nombre à 3 chiffres ? oui, donc on affiche 3 (le troisième chiffre)
    • 8e # : est-ce que le nombre à 2 chiffres ? oui, donc on affiche 4 (le quatrième chiffre)
    • 9e # : est-ce que le nombre à 1 chiffres ? oui, donc on affiche 5 (le cinquième chiffre)


    Au final, on obtient donc " 12 345,00"
    ça confirme donc l'hypothèse que j'avais émise dans mon deuxième message.
    Et d'ailleurs c'est logique mais ça signifie que je vais devoir gérer ce cas.

    Pour la petite histoire, j'essaie de corriger un outil qui analyse une suite de commande textuelle et ressort un document.
    Jusqu'à présent la grammaire de la commande pour formater un nombre ne prévoyait pas d'autres cas que ceux des formats de nombre personnalisés (et quelques formats en dur permettant entre autre la traduction en chiffre romain ou en toutes lettres).

    A bien y réfléchir, ça ne devrait pas me prendre trop longtemps pour gérer les formats standards

    Edit :
    Au final, ça fonctionne déjà.
    J'ai été bien inspiré d'implémenter un pattern interpréteur pour la grammaire globale considérant ce format comme une chaîne quelconque et d'en avoir un second uniquement pour l'interprétation du format.
    Il ne reste plus qu'à mettre à à jour la documentation.

    Merci.
    Et bonne année à ceux à qui je ne l'ai pas encore souhaité.

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

Discussions similaires

  1. Comportement bizarre de mes FPS
    Par Ekinoks dans le forum OpenGL
    Réponses: 7
    Dernier message: 22/08/2005, 15h14
  2. xsl:test .... avec comportement bizarre
    Par Blue LC dans le forum XMLRAD
    Réponses: 2
    Dernier message: 10/06/2005, 13h56
  3. [ACESS][MEMO][ISNULL]Comportement bizarre
    Par seb.49 dans le forum ASP
    Réponses: 2
    Dernier message: 09/06/2004, 10h44
  4. [HttpClient] comportement bizarre, saute des catch()...
    Par iubito dans le forum Développement Web en Java
    Réponses: 4
    Dernier message: 04/02/2004, 15h25
  5. [Sybase] Comportement bizarre d'une table
    Par sdozias dans le forum Sybase
    Réponses: 4
    Dernier message: 03/02/2004, 10h39

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