Enrera
Mòdul 2
Iniciació a la programació en Java
  Pràctica
1
2
3
4
   
Exercicis
Exercicis
 
 
  Conversió i Format
   
 

Aquesta pràctica ens servirà per a:

  • Repassar la forma de convertir informació d'un tipus primitiu a un altre.

  • Aprendre a donar format a nombres, monedes i dates.
   
Conversió entre tipus primitius (casting):
   

La conversió (casting) és una de les necessitats més freqüents en qualsevol entorn de programació i cada llenguatge resol aquest problema d'una forma diferent. Hi ha llenguatges laxament tipificats, com Perl o, en certa mesura javaScript (bruts, en llengua col·loquial) que són molt elàstics en la conversió entre tipus: una variable de cadena pot convertir-se en un nombre enter i aquest en un nombre amb decimals en el moment en què es vulgui: el compilador no es queixa, però és responsabilitat seva que les conversions entre tipus siguin coherents.

Java no permet aquests moviments ja que és un llenguatge fortament tipificat. Cada variable pertany estrictament al tipus en què es va crear. Si necessitem fer una conversió hem de crear una variable de destinació, la qual contindrà el nou valor i només després podrem fer la conversió, explícitament o implícita.

Quan es tracta de tipus numèrics les conversions s'han de fer, generalment, del tipus de jerarquia baixa cap al tipus de jerarquia més alta: un byte passa fàcilment a short i aquest a int, però no a l'inrevès, en aquest darrer cas hi ha perill de pèrdua d'informació. De menys a més la conversió es pot fer de manera implícita:

short petit;
int mesgran;

petit=1;
mesgran=petit;

Si és necessària una conversió de més nivell a menys nivell, el programador és l'encarregat de vigilar la coherència de les dades. En aquest cas, la conversió s'ha de fer explícita:

int gran
short petit;

gran=1000000;
petit=(short) gran;
// Error de casting!!

Si el compilador reconeix la impossibilitat de la conversió, obtindrem un error en temps de compil·lació i, si es produeix més tard, l'error serà en temps d'execució. En el cas que la conversió sigui de reals a enters, Java intentarà salvar la situació eliminant del número la part decimal: 12,9 el convertirà a 12.

Podem observar que la conversió (casting) explícita es fa seguint aquesta sintaxi:

<Tipus Nou> variable_nova = ( <Tipus Nou> ) variable_vella;

Posem entre parèntesis i davant de la variable a convertir el nou tipus que pretenem obtenir.

Una necessitat freqüent és la conversió de dades de tipus cadena (string) a nombres i a l'inrevés. Java tampoc permet fer aquest tipus de conversió i, en aquest cas, tampoc és possible fer conversions explícites:

String cadena="25000";
int numero = (int) cadena; // Això no és correcte!!

Però tenim una solució: com que totes les classes primitives disposen dels seus equivalents en tipus referenciats, podem utilitzar les eines dels tipus referenciats per a fer les conversions. Per exemple, la conversió d'una cadena (String) a nombre enter (int) es pot fer així:

String cadena="25000";
int numero = Integer.parseInt(cadena);

El mètode parseInt() de la classe java.lang.Integer és static (consulteu la documentació d'aquesta classe!) Això vol dir que s'executarà el mateix codi i es reservaran les mateixes posicions de mèmòria per a qualsevol procés que el cridi. No cal doncs, encarregar cap previsió d'utilització a la Màquina Virtual de Java, i la clàusula new, que fem anar sempre que creem una classe nova, aquí és supèrflua.

Com que no estem segurs que cadena contingui sempre un número enter correcte, no és mala idea tancar la conversió en un bloc try...catch:

String cadena="25000";
int numero=0;
try {
    numero=Integer.parseInt(cadena);
} catch(Exception e) {}

Aquest model de conversió val per a qualsevol tipus numèric (Integer, Double, Float ...).

El procés invers és similiar. Per passar un nombre a cadena:

int numero=5000;
String cadena;
try {
   cadena=Integer.toString(numero);
} catch(Exception e) {}

Les capacitats de conversió que acabem d'explicar no fan referència només als tipus primitius de Java: es poden utilitzar amb qualsevol altra parella de tipus de Java. A la pràctica 2 del ṃdul següent d'aquest mòdul aprendrem a fer conversió entre objectes de diferents classes.

   
Donar Format
   

Les conversions que acabem de veure no garanteixen que el format fruit de la conversió sigui el desitjat. Imaginem una conversió de Double a String. Potser estem treballant amb qualificacions d'alumnes i volem dir que un alumne treu un 7.5, però després de fer la conversió del decimal a cadena, Java ens informa que l'alumne ha tret un 7.4645739349434. Aquesta informació, encara que precisa, és poc presentable al públic. Hem de manipular el seu format.

La base de la representació d'informació en Java és la classe java.lang.String. S'utilitza tant que Java li deixa passar algunes coses que no permet a altres classes. Per exemple,

  • Podem declarar i inicialitzar Strings sense utilitzar el modificador new:

    • String elmeunom="Josep Capdevila";


  • Tot i que la classe String, un cop declarada, no pot canviar de contingut, Java ens permet fer-ho sense que en siguem conscients.

  • Podem utilitzar l'operador matemàtic "+" per a unir dues cadenes.

Disposem de moltes eines de format aplicables a cadenes. En destacarem algunes:

  1. Partir una cadena en parts: Volem aïllar una informació agrupada en una cadena i sabem que cada unitat d'informació està separada per un caràcter. Utilitzarem la classe java.util.StringTokenizer:

    /**
    * A partir d'una cadena que conté informació de pluviositat
    * separada per comes, n'extraiem les dades. La primera entrada
    * correspon al nom de la ciutat, les sis següents a la
    * pluviositat dels sis darrers mesos
    */

    public class Parteix {
        public static void main(String[] args) {
            String cadena="Lleida,290,690,500,487,345,698";
            java.util.StringTokenizer t = new                      java.util.StringTokenizer(cadena,",");
            int bocins = t.countTokens();
            if (bocins>0) {
                System.out.println("Ciutat de "+t.nextToken()+
                         " pluviositat mensual");
                System.out.println("------------------------------");
            }
            while (t.hasMoreElements()) {
                System.out.println(t.nextToken());
            }
        }
    }

  2. Donar format a nombres: Volem representar nombres, i decidir-ne aspectes com els caràcters de separació de milers i decimals, el nombre de decimals a representar, la simbologia de monedes, etc. Utilitzarem les classes java.text.NumberFormat (abstracta) o java.text.DecimalFormat (subclasse de la primera):

    /**
    * Formata decimals i monedes
    */

    public class FormatDecimals {

        public static void main(String[] args) {
            java.text.NumberFormat n =
                java.text.NumberFormat.getInstance();
    // Per a nombres
            java.text.NumberFormat mf =
                          java.text.NumberFormat.getCurrencyInstance(
                                           java.util.Locale.FRANCE);
             java.text.NumberFormat mg =                       java.text.NumberFormat.getCurrencyInstance(
                                           java.util.Locale.GERMANY);
             n.setMaximumFractionDigits(2);
             double nota = 7.345324534543;
             System.out.println("El vell PI");
             System.out.println(Math.PI);
             System.out.println("Un PI humil");
             System.out.println(n.format(Math.PI));
             System.out.println("Si un alumne qualifica amb un");
             System.out.println(nota);
             System.out.println("Queda millor posar");
             System.out.println(n.format(nota));
             System.out.println("monedes");
             System.out.println(mf.format(500));
             System.out.println(mg.format(500));
        }
    }

    Java no disposa d'un Locale.SPAIN, ni en la darrera versió. A efectes monetaris no té molta importància gràcies a l'adopció de l'euro que ens unifica amb altres Locale. Com soluciona Java el problema del canvi de moneda en els països que han adoptat l'Euro? Senzillament es mira la data del sistema. Si és anterior a l'1 de gener de 2002 retorna la moneda local, si és posterior, retorna l'Euro.

  3. ) Donar format a dates. Per formatar dates hem d'utilitzar la classe java.text.DateFormat. Ens permet seleccionar entre diferents nivells de detall en la representació d'una data:

    /**
    * Programa que dóna format a una data
    */

    public class UnesDates {
        public static void main(String[] args) {
        java.util.Date data = new java.util.Date();
        System.out.println("Una data tal qual");
        System.out.println(data);
        System.out.println("Una data formatada");
        System.out.println(
            java.text.DateFormat.getDateInstance().format(data));
        }
    }
   
   
 
Amunt