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

avec Java Discussion :

Manipuler un BigDecimal


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2011
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juillet 2011
    Messages : 43
    Points : 17
    Points
    17
    Par défaut Manipuler un BigDecimal
    Bonjour,

    Je viens vers vous, car je ne trouve pas de solution à mon "petit" problème.
    Je m'explique :
    - J'ai un BigDecimal qui doit être ensuite inséré dans une base de données. Il doit, pour être bien insérer, ne pas dépasser 3 chiffres avant la virgule et 5 chiffres après la virgule. (ex. ###.#####)
    Si mon travail était simplement d'appliquer un format précis à un BigDecimal avec un DecimalFormat, ce serait facile, mais non ^^. J'ai besoin seulement de savoir si le BigDecimal peut être insérer en base, c-à-d s'il respecte bien le format. Comment faire ?
    En faite, pour être plus précis, si j'insère en base un BigDecimal mal formaté j'aurais biensûr une exception à l'insertion de celui-ci, mais j'ai besoin d'avoir un message plus précis que celui remonté par la couche bdd.

    Voilà, j'espère vous avoir bien expliquer mon problème.
    Par avance, merci.

    Cordialement,
    Kévin.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Points : 1 745
    Points
    1 745
    Par défaut
    Faire un toString() sur ton BigDecimal et ensuite appeler matches(String regEx).

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2011
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juillet 2011
    Messages : 43
    Points : 17
    Points
    17
    Par défaut
    Justement, quand j'appelle la méthode toString() sur mon BigDecimal, et que par exemple mon BigDecimal est dans le bon format, cette méthode rajoute des chiffres après la virgule.

    Ex.
    BigDecimal bd = BigDecimal(345.67886);
    System.out.print(bd.toString());

    => 345.67886000009876

    Il ne me renvoi pas la même valeur. Donc dans tous les cas, même si mon BigDecimal est juste, je serais toujours dans le cas où le BigDecimal est dans le mauvais format. Tu comprends mon problème ?

  4. #4
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Points : 1 745
    Points
    1 745
    Par défaut
    Et en utilisant le scale ?
    Avec une méthode de Round.

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Points : 1 745
    Points
    1 745
    Par défaut
    Voici ce que je voulais dire.
    Mais tu vas perdre en précision.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    BigDecimal bd = new BigDecimal(345.67886);
    bd = bd.setScale(3, BigDecimal.ROUND_HALF_UP);
    System.out.print(bd.toString());
    Affiche : 345.679

    Ou alors passer par le constructeur à chaine de caractère qui lui garde la valeur exacte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    BigDecimal bd = new BigDecimal("345.67886");
    System.out.print(bd.toString());
    Affiche : 345.67886

  6. #6
    Membre à l'essai
    Inscrit en
    Juillet 2011
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juillet 2011
    Messages : 43
    Points : 17
    Points
    17
    Par défaut
    Oui mais cela revient au même en faite, parce que si mon BigDecimal est dans le mauvais format (c-à-d. qu'il possède plus de 5chiffres après la virgule), la méthode setScall() va arrondir mon décimal à 5 chiffres après la virgule donc je ne pourrais pas gérer le cas où mon BigDecimal dépasse ces 5 chiffres après la virgule parce qu'il ne dépassera, en effet, jamais les 5 chiffres.

  7. #7
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Points : 1 745
    Points
    1 745
    Par défaut
    Il faut donc que tu utilise le constructeur avec une String
    This is generally the preferred way to convert a float or double into a BigDecimal, as it doesn't suffer from the unpredictability of the BigDecimal(double) constructor.
    ==> Cours et tutoriels Java : http://java.developpez.com/cours/ (jmdoudoux chap-math)


    Après tu pourrais faire un toString qui ne t'ajoutera pas de nombres après la virgule. Puis faire le matches avec l'expression régulière qui va bien.

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Citation Envoyé par Kixxx Voir le message
    Justement, quand j'appelle la méthode toString() sur mon BigDecimal, et que par exemple mon BigDecimal est dans le bon format, cette méthode rajoute des chiffres après la virgule.

    Ex.
    BigDecimal bd = BigDecimal(345.67886);
    System.out.print(bd.toString());

    => 345.67886000009876

    Il ne me renvoi pas la même valeur. Donc dans tous les cas, même si mon BigDecimal est juste, je serais toujours dans le cas où le BigDecimal est dans le mauvais format. Tu comprends mon problème ?
    Aucune méthode ne rajoute rien du tout. Tu construis ton BigDecimal à partir du littéral double 345.67886, dont la valeur réelle est 345.67886000009876. C'est donc ce que vaut ton BigDecimal, et ce qu'affiche toString().
    Il fallait faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BigDecimal bd = new BigDecimal("345.67886");
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre à l'essai
    Inscrit en
    Juillet 2011
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juillet 2011
    Messages : 43
    Points : 17
    Points
    17
    Par défaut
    Ok, tout d'abord un très grand merci pour tes réponses rapides.

    Ceci marcherait mais ... dans mon cas je ne peux pas utiliser le constructeur avec une String. Pourquoi ? Parce que je reçois un objet BigDecimal et non une String dans ma méthode principale de mon Web Service. Et par soucis professionnel, je ne peux NORMALEMENT pas modifier le type de cet attribut dans ma signature... arfff

  10. #10
    Membre à l'essai
    Inscrit en
    Juillet 2011
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juillet 2011
    Messages : 43
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Aucune méthode ne rajoute rien du tout. Tu construis ton BigDecimal à partir du littéral double 345.67886, dont la valeur réelle est 345.67886000009876. C'est donc ce que vaut ton BigDecimal, et ce qu'affiche toString().
    Il fallait faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BigDecimal bd = new BigDecimal("345.67886");
    Oui je m'en doutais mais j'ai un peu de mal à m'exprimer en ce moment ^^ lol dsl

  11. #11
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Points : 1 745
    Points
    1 745
    Par défaut
    Citation Envoyé par Kixxx Voir le message
    je reçois un objet BigDecimal et non une String dans ma méthode principale de mon Web Service.
    Dans le cadre d'un webservice, ce sera au client d'utiliser la bonne façon de construire le BigDecimal (Si'il s'agit d'un client Java) ou la méthode équivalente dans les autres langages (S'il en existe une).

    Le problème étant que lors des passages BigDecimal(Ou autre) -> XML -> BigDecimal, rien ne garantit que ce soit le constructeur avec la String qui soit utilisé.

  12. #12
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Citation Envoyé par Kixxx Voir le message
    Ok, tout d'abord un très grand merci pour tes réponses rapides.

    Ceci marcherait mais ... dans mon cas je ne peux pas utiliser le constructeur avec une String. Pourquoi ? Parce que je reçois un objet BigDecimal et non une String dans ma méthode principale de mon Web Service. Et par soucis professionnel, je ne peux NORMALEMENT pas modifier le type de cet attribut dans ma signature... arfff
    Bon, mais que veux-tu au juste ?
    On t'a déjà dit que pour vérifier si ton BigDecimal respecte bien les nombres de chiffres avant et après, tu peux faire un simple toString() et vérifier sa regex.

    (Pour faire plus propre, tu peux aussi vérifier que toBigInteger() et precision() ne dépassent pas les valeurs voulues.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  13. #13
    Membre à l'essai
    Inscrit en
    Juillet 2011
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juillet 2011
    Messages : 43
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Bon, mais que veux-tu au juste ?
    On t'a déjà dit que pour vérifier si ton BigDecimal respecte bien les nombres de chiffres avant et après, tu peux faire un simple toString() et vérifier sa regex.
    Ok, je viens de comprendre mon problème. Je pense que je vais pouvoir le résoudre.

    Je fermerai le sujet quand ce sera fait ^^.
    Un très grand merci à vous deux et à votre réactivité.

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

Discussions similaires

  1. Manipulation des handle contexte
    Par rockbiker dans le forum DirectX
    Réponses: 1
    Dernier message: 09/05/2003, 18h51
  2. Manipuler JAVA et SSL ?
    Par jah dans le forum Sécurité
    Réponses: 6
    Dernier message: 05/05/2003, 00h30
  3. [VB6]manipuler les semaines en VB ?
    Par kamadji dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 02/05/2003, 12h33
  4. Réponses: 2
    Dernier message: 18/01/2003, 17h06
  5. Fonctions de manipulation des chaines et des dates
    Par Fares BELHAOUAS dans le forum Débuter
    Réponses: 3
    Dernier message: 09/11/2002, 22h43

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