4/5 (2 avis)
Snippet vu 21 215 fois - Téléchargée 28 fois
import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; public class Conversions { //declarations des composants graphiques private JFrame fenetre; private JSlider base; private JPanel p1,p2,p3; private JTextField jfield1,jfield2; private JLabel label3,label2; private JTextArea jarea; private final static String doc = //aide contenue dans le JTextArea "\t\tBrève documentation de cette application... \n"+ "\nCe petit programme permet de convertir un nombre en base 10 dans une base comprise entre 2 et 36.\n" + "Le \"potentiomètre\" permet de selectionner la base.\n" + "La modification d'un champ suivie de la validation par la touche ENTREE met à jour l'autre champ.\n" + "Lors d'un changement de la base, la valeur en base 10 est convertie.\n\n"+ "Les nombres saisis s'écrivent en utilisant les chiffres de 0 à 9,\n"+ "puis les lettres de A à Z (miniscules ou majuscules).\n"; private final static String[] chiffres = {"0","1","2","3","4","5","6","7","8","9","A", "B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W", "X","Y","Z"}; //Constructeur public Conversions() { fenetre = new JFrame("Conversions..."); Container reser = fenetre.getContentPane(); label2 = new JLabel("En base 10"); label3 = new JLabel("En base 2"); //--- haut de la fenetre ------------------------------------------------------------------------------- String s1 = "Changement de base de numération"; jarea = new JTextArea(doc); jarea.setEditable(false); JScrollPane jscroll = new JScrollPane(jarea); p1 = new JPanel(new BorderLayout()); p1.add(jscroll,BorderLayout.NORTH); p1.setBorder(BorderFactory.createTitledBorder(s1)); reser.add(p1,BorderLayout.NORTH); //--- JSlider ---------------------------------------------------------------------------------------------- p2 = new JPanel(new GridLayout(0,1)); String s2 = "Sélection de la base"; base = new JSlider(2,36,2); //--- listener du slider ----------------------------------------------------------------------------------- ChangeListener b = new ChangeListener() { public void stateChanged(ChangeEvent e) { label3.setText("En base "+base.getValue()); label3.setHorizontalAlignment(SwingConstants.CENTER); String res = ""; if (jfield1.getText() == null || jfield1.getText().length() == 0){ jfield1.setText(JOptionPane.showInputDialog(fenetre,"Entrez un nombre en base 10","Champ \"Base 10\" vide",JOptionPane.QUESTION_MESSAGE));}//if String s = jfield1.getText(); boolean erreur = false; for (int i =0;((i<s.length()) && (!erreur));i++) { if (!('0'<=s.charAt(i) && s.charAt(i)<='9')) { Toolkit.getDefaultToolkit().beep(); JOptionPane.showMessageDialog(fenetre,"En base 10, on n'utilise uniquement les chiffres entre 0 et 9","Chiffre non autorisé",JOptionPane.ERROR_MESSAGE); erreur = true; }//if }//for if (!erreur) { int b = Integer.parseInt(jfield1.getText()); int n = base.getValue(); while (b != 0 ) { res = chiffres[b%n]+res; b = b/n; }//while }//if jfield2.setText(res); } }; base.addChangeListener(b); base.setMajorTickSpacing(2); base.setPaintTicks(true); base.setPaintLabels(true); p2.add(base); p2.setBorder(BorderFactory.createTitledBorder(s2)); reser.add(p2,BorderLayout.CENTER); //--- les champs de saisie -------------------------------------------------------------------------------------------- p3 = new JPanel(new GridLayout(0,2)); jfield1 = new JTextField(""); jfield2 = new JTextField(""); jfield1.setHorizontalAlignment(SwingConstants.CENTER); jfield2.setHorizontalAlignment(SwingConstants.CENTER); label2.setHorizontalAlignment(SwingConstants.CENTER); label3.setHorizontalAlignment(SwingConstants.CENTER); //--- mise a l'écoute des champs ---------------------------------------------------------------------------------------- //--- champ base 10 ----------------------------------------------------------------------------------------------------- ActionListener b10 = new ActionListener() { public void actionPerformed(ActionEvent e) { String s = jfield1.getText(); boolean erreur = false; for (int i =0;i<s.length() && !erreur;i++) { if (!('0'<=s.charAt(i) && s.charAt(i)<='9')) { Toolkit.getDefaultToolkit().beep(); JOptionPane.showMessageDialog(fenetre,"En base 10, on n'utilise uniquement les chiffres entre 0 et 9","Chiffre non autorisé",JOptionPane.ERROR_MESSAGE); erreur = true; }//if }//for if (!erreur) { String res = ""; int b = Integer.parseInt(jfield1.getText()); int n = base.getValue(); while (b != 0 ) { res = chiffres[b%n]+res; b = b/n; }//while jfield2.setText(res); }//if }//actionPerformed };//class anonyme jfield1.addActionListener(b10); //--- champ de la base n ------------------------------------------------------------------------------------------------- ActionListener bn = new ActionListener() { public void actionPerformed(ActionEvent e) { try{ jfield1.setText(""+Integer.parseInt(jfield2.getText(),base.getValue())); }catch (NumberFormatException nfe) { JOptionPane.showMessageDialog(fenetre,"En base "+base.getValue()+", on utilise les chiffres entre 0 et "+chiffres[base.getValue()-1],"Chiffre non autorisé",JOptionPane.ERROR_MESSAGE); }//catch }//actionPerformed };//class anonyme jfield2.addActionListener(bn); //-------------------------------------------------------------------------------------------------------------------- p3.add(label2); p3.add(jfield1); p3.add(label3); p3.add(jfield2); reser.add(p3,BorderLayout.SOUTH); }//Conversions() //affichage public void afficher() { fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); fenetre.setSize(650,350); fenetre.setResizable(false); fenetre.setVisible(true); }//afficher //main public static void main (String [] args) { Conversions convertisseur = new Conversions(); convertisseur.afficher(); }//main }//class Conversions
17 févr. 2012 à 16:42
Ton source est cool mais il y a bien plus simple (et performant) en utilisant la classe Integer...
Exemple :
int a =Integer.parseInt("279871492", 10);
System.out.println("A en base 10 : "+a);
System.out.println("A en base 10 : "+Integer.toString(a, 10));
System.out.println("A en base 36 : "+Integer.toString(a, 36));
int b =Integer.parseInt(Integer.toString(a, 36), 36);
System.out.println("B en base 36 : "+Integer.toString(b, 36));
System.out.println("B en base 10 : "+b);
System.out.println("B en base 10 : "+Integer.toString(b, 10));
for (int i=0;i<36;i++)
{
System.out.println("Chiffre de la base 36 : "+Integer.toString(i,36));
}
produira :
Nombre: 1492 (base=10)
A en base 10 : 279871492
A en base 10 : 279871492
A en base 36 : 4mmm84
B en base 36 : 4mmm84
B en base 10 : 279871492
B en base 10 : 279871492
...
Il y est clair qu'on peut ainsi passer de n'importe quelle base à n'importe quelle autre et pas uniquement de ou vers la base 10 !
A++
Nicolas
15 nov. 2005 à 19:35
tu aurais pu par contre gérer les exceptions dans des catch..
merci en tout cas !
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.