Aller au contenu

Les Conversions en Java (implicites et explicites)

Le plus simple consiste à recopier le code ci-dessous dans une classe nommée ConversionsNumeriques et de l’exécuter pour constater ce qui se passe.

package fr.mer.gestion.semaine1;

/**
 * TP0 : les conversions numériques avec des exemples (types primitifs, casting, parsing)
 */
public class ConversionsNumeriques {
    public static void main(String[] args) {
        System.out.println("╔═══════════════════════════════════════════════════════╗");
        System.out.println("║         LES CONVERSIONS NUMÉRIQUES EN JAVA            ║");
        System.out.println("╚═══════════════════════════════════════════════════════╝");
        System.out.println();
        
        // ═══════════════════════════════════════
        // 1. Conversion double vers int (troncature)
        // ═══════════════════════════════════════
        
        System.out.println("1. Conversion double vers int (troncature)");
        System.out.println("   ─────────────────────────────────────");
        
        double prix = 19.99;
        int prixEntier = (int) prix;  // un Cast explicite nécessaire
        
        System.out.println("   Prix original (double) : " + prix);
        System.out.println("   Prix entier (int)      : " + prixEntier);
        System.out.println("   La partie décimale est PERDUE (troncature)");
        System.out.println("   Équivalent COBOL : MOVE prix TO prix-entier");
        System.out.println();
        
        // ═══════════════════════════════════════
        // 2. calcul avec conversion implicite
        // ═══════════════════════════════════════
        
        System.out.println("2. Conversion implicite dans les calculs");
        System.out.println("   ─────────────────────────────────────");
        
        int quantite = 5;
        double total = prix * quantite;  // int → double automatique
        
        System.out.println("   " + prix + " (double) × " + quantite + " (int)");
        System.out.println("   = " + total + " (double)");
        System.out.println("   Java convertit automatiquement int vers double");
        System.out.println();
        
        // ═══════════════════════════════════════
        // 3. conversion String vers int (c'est du parsing)
        // ═══════════════════════════════════════
        
        System.out.println("3. Conversion String vers int");
        System.out.println("   ─────────────────────────────────────");
        
        String texte = "1250";
        int nombre = Integer.parseInt(texte);
        
        System.out.println("   Texte  : \"" + texte + "\" (String)");
        System.out.println("   Nombre : " + nombre + " (int)");
        System.out.println("   Méthode : Integer.parseInt()");
        System.out.println();
        
        // ═══════════════════════════════════════
        // 4. conversion int vers String
        // ═══════════════════════════════════════
        
        System.out.println("4. Conversion de int vers String");
        System.out.println("   ─────────────────────────────────────");
        
        int valeur = 12345;
        String texteNombre1 = String.valueOf(valeur);
        String texteNombre2 = "" + valeur;  // Alternative simple
        String texteNombre3 = Integer.toString(valeur);
        
        System.out.println("   Nombre : " + valeur);
        System.out.println("   Méthode 1 : String.valueOf() → \"" + texteNombre1 + "\"");
        System.out.println("   Méthode 2 : \"\" + nombre     → \"" + texteNombre2 + "\"");
        System.out.println("   Méthode 3 : Integer.toString() → \"" + texteNombre3 + "\"");
        System.out.println();
        
        // ═══════════════════════════════════════
        // 5. Faires des arrondis vers troncature
        // ═══════════════════════════════════════
        
        System.out.println("5. Arrondi vers troncature");
        System.out.println("   ─────────────────────────────────────");
        
        double valeur1 = 19.3;
        double valeur2 = 19.7;
        
        int tronque1 = (int) valeur1;
        int tronque2 = (int) valeur2;
        
        long arrondi1 = Math.round(valeur1);
        long arrondi2 = Math.round(valeur2);
        
        System.out.println("   Valeur : " + valeur1);
        System.out.println("   Tronqué : " + tronque1 + " | Arrondi : " + arrondi1);
        System.out.println();
        System.out.println("   Valeur : " + valeur2);
        System.out.println("   Tronqué : " + tronque2 + " | Arrondi : " + arrondi2);
        System.out.println();
        
        // ═══════════════════════════════════════
        // 6. Gérer les erreurs de conversions
        // ═══════════════════════════════════════
        
        System.out.println("6. Gestion des erreurs de conversion");
        System.out.println("   ─────────────────────────────────────");
        
        String texteValide = "123";
        String texteInvalide = "abcdef123";
        
        // la conversion est valide
        try {
            int nb1 = Integer.parseInt(texteValide);
            System.out.println("   ✓ \"" + texteValide + "\" → " + nb1);
        } catch (NumberFormatException e) {
            System.out.println("   ✗ Erreur de conversion");
        }
        
        // ici, la conversion est invalide
        try {
            int nb2 = Integer.parseInt(texteInvalide);
            System.out.println("   ✓ \"" + texteInvalide + "\" → " + nb2);
        } catch (NumberFormatException e) {
            System.out.println("   ✗ \"" + texteInvalide + "\" ne peut pas être converti !");
            System.out.println("   Message : " + e.getMessage());
        }
        System.out.println();
        
        // ══════════════════════════════════════════
        // 7. Conversions entre les types numériques
        // ═══════════════════════════════════════════
        
        System.out.println("7. Hiérarchie des types numériques");
        System.out.println("   ─────────────────────────────────────");
        System.out.println("   byte (8 bits) → short (16 bits) → int (32 bits)");
        System.out.println("   → long (64 bits) → float (32 bits) → double (64 bits)");
        System.out.println();
        
        // conversions ascendantes (implicites)
        byte petitNombre = 100;
        short moyenNombre = petitNombre;      // implicite
        int grandNombre = moyenNombre;         // implicite
        long tresGrandNombre = grandNombre;    // implicite
        double reel = tresGrandNombre;         // implicite
        
        System.out.println("   Conversions implicites :");
        System.out.println("   byte  : " + petitNombre);
        System.out.println("   short : " + moyenNombre);
        System.out.println("   int   : " + grandNombre);
        System.out.println("   long  : " + tresGrandNombre);
        System.out.println("   double: " + reel);
        System.out.println();
        
        // conversions descendantes (explicites - on appelle cela le casting)
        double grand = 1000.75;
        int moyen = (int) grand;               // le Cast est nécessaire
        short petit = (short) moyen;           // le Cast est nécessaire
        byte tresPetit = (byte) petit;         // le Cast est nécessaire
        
        System.out.println("   conversions explicites :");
        System.out.println("   double: " + grand);
        System.out.println("   int   : " + moyen + " (partie décimale perdue)");
        System.out.println("   short : " + petit);
        System.out.println("   byte  : " + tresPetit);
        System.out.println();
        
        // ═══════════════════════════════════════
        // 8. Sting vers double
        // ═══════════════════════════════════════
        
        System.out.println("8. Autres conversions avec les String");
        System.out.println("   ─────────────────────────────────────");
        
        String prixTexte = "99.99";
        double prixDouble = Double.parseDouble(prixTexte);
        System.out.println("   String → double : \"" + prixTexte + "\" → " + prixDouble);
        
        String longTexte = "9876543210";
        long longNombre = Long.parseLong(longTexte);
        System.out.println("   String → long   : \"" + longTexte + "\" → " + longNombre);
        
        String boolTexte = "true";
        boolean boolValeur = Boolean.parseBoolean(boolTexte);
        System.out.println("   String → boolean: \"" + boolTexte + "\" → " + boolValeur);
        
        System.out.println();
        System.out.println("╔═══════════════════════════════════════════════════════╗");
        System.out.println("║  Règle : Il faut toujours gérer les exceptions        ║");
        System.out.println("║  lors des conversions String vers un nombre !         ║");
        System.out.println("╚═══════════════════════════════════════════════════════╝");
    }
}