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

Java Discussion :

[Java][String] format %02d - Résultat


Sujet :

Java

  1. #1
    Membre habitué Avatar de JQueen
    Inscrit en
    Octobre 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Octobre 2008
    Messages : 214
    Points : 126
    Points
    126
    Par défaut [Java][String] format %02d - Résultat
    Bonjour,

    J'essaye de calculer un time à partir d'une durée.
    Le time doit respecter le format suivant : hh:mm:ss:ff

    Voilà ce que j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    final long hr = TimeUnit.MILLISECONDS.toHours(halfDurationMs);
    final long min = TimeUnit.MILLISECONDS.toMinutes(halfDurationMs - TimeUnit.HOURS.toMillis(hr));
    final long sec = TimeUnit.MILLISECONDS.toSeconds(halfDurationMs - TimeUnit.HOURS.toMillis(hr) - TimeUnit.MINUTES.toMillis(min));
    final long ms = TimeUnit.MILLISECONDS.toMillis(halfDurationMs - TimeUnit.HOURS.toMillis(hr) - TimeUnit.MINUTES.toMillis(min) - TimeUnit.SECONDS.toMillis(sec));
     
    String time = String.format("%02d:%02d:%02d:%02d", hr, min, sec, ms);
    Mon problème est que pour certaines durées là où les millisecondes tiennent sur 3 caractères , j'ai un time de la forme hh:mm:ss:fff
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Pour la durée : 00:34:03
    Le time calculé est : 00:17:01:500
    Le time attendu est : 00:17:01:50
    J'ai pensé à ajouter un contrôle sur les millisecondes, du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    String msStr = String.valueOf(ms);
     if(msStr.length() > 2){
    	  msStr = msStr.substring(0, 2);
    }
    Est-ce la solution la plus propre ?
    Sinon, Comment faire ?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 670
    Points : 10 677
    Points
    10 677
    Par défaut
    Le bon réflexe c'est de lire la documentation officielle : Class Formatter (<- lien en anglais)

    Dans le format %02d :
    • Le 0 c'est un "flag" : le résultat sera bourré de zéro
    • Le 2 c'est la largeur "width" : c'est le minimum de caractères à afficher

  3. #3
    Membre habitué Avatar de JQueen
    Inscrit en
    Octobre 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Octobre 2008
    Messages : 214
    Points : 126
    Points
    126
    Par défaut
    Merci pour ta réponse rapide foetus.

    En effet, c'est parce que j'ai bien lu la documentation, et j'ai compris que le %02d me retournera au moins deux caractères, que j'ai finalement posé ma question ici.

    Autrement dit, ma question est : existe-il un autre formatter java qui permet de retourner uniquement et exactement 2 caractères ?

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    C'est plutôt un mauvaise idée de vouloir tronquer un nombre...
    que devrait afficher un %02d si tu lui passes 560 ? 56 ? 60 ?
    Mais dans ce cas que faire pour les "vrai" valeurs 56 et 60 ??

    Ton problème c'est surtout que tu te trompes d'unité !
    Si tu veux afficher 2 chiffres après les secondes, il ne faut pas utiliser des millisecondes mais des centièmes de secondes.

    Bref il faut diviser tes ms par 10...

  5. #5
    Membre habitué Avatar de JQueen
    Inscrit en
    Octobre 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Octobre 2008
    Messages : 214
    Points : 126
    Points
    126
    Par défaut
    Merci pour ta repnse adiGuba.

    C'est plutôt un mauvaise idée de vouloir tronquer un nombre...
    Je suis tout à fait d'accord, et c'est une solution que j'ai éliminé dès le début.

    La solution que j'ai adoptée consiste à tester la longueur des ms, et si ça dépasse les 2 caractères, je prends uniquement les deux premiers. Mais comme je pensais que ce n'est pas la solution la plus propre qui existait, j'ai posé ma question ici.

    Ton problème c'est surtout que tu te trompes d'unité !
    Si tu veux afficher 2 chiffres après les secondes, il ne faut pas utiliser des millisecondes mais des centièmes de secondes.

    Bref il faut diviser tes ms par 10...
    ça réponds parfaitement à ma question.

    Voilà la solution finale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    final long hr = TimeUnit.MILLISECONDS.toHours(halfDurationMs);
    	        final long min = TimeUnit.MILLISECONDS.toMinutes(halfDurationMs - TimeUnit.HOURS.toMillis(hr));
    	        final long sec = TimeUnit.MILLISECONDS.toSeconds(halfDurationMs - TimeUnit.HOURS.toMillis(hr) - TimeUnit.MINUTES.toMillis(min));
    	        final long ms = TimeUnit.MILLISECONDS.toMillis(halfDurationMs - TimeUnit.HOURS.toMillis(hr) - TimeUnit.MINUTES.toMillis(min) - TimeUnit.SECONDS.toMillis(sec)) ;
     
    	        time = String.format("%02d:%02d:%02d:%02d", hr, min, sec, ms/10);

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

Discussions similaires

  1. Parser un string format ISO en date Java
    Par ttttnht dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 16/07/2008, 17h59
  2. [Java/String] Completer une chaine avec un caractere
    Par shaun_the_sheep dans le forum Langage
    Réponses: 4
    Dernier message: 31/05/2005, 09h01
  3. [VB.NET] StringBuilder Vs String.Format
    Par maitrebn dans le forum Windows Forms
    Réponses: 6
    Dernier message: 19/10/2004, 18h58
  4. [C#] String.Format
    Par alexischmit dans le forum Windows Forms
    Réponses: 3
    Dernier message: 18/05/2004, 11h58
  5. [VC++ .NET] String::Format({?}, ...
    Par benoitB dans le forum MFC
    Réponses: 2
    Dernier message: 15/12/2003, 13h22

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