Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    Problema con parseInt()

    Ciao a tutti!

    Premetto che sono abbastanza inesperto con Java e quindi probabilmente molti di voi rideranno delle mie lacune, ma proprio questo problema non sono riuscito a risolverlo.

    Dunque, vorrei avere una funzione che analizza una stringa (contenente un numero telefonico scritto ad esempio nella forma "+39 0123 45678"), rimuovendone gli spazi e alcuni caratteri ('-' e '/') e modificando il carattere + con "00". Il codice è il seguente:

    codice:
    /* Rimpiazza caratteri dentro una stringa */
    import java.io.*;
    import java.util.*;
    
    class Rimpiazza {
      public static void main(String[] args) throws IOException {
        
        String orig = "+39 0123 456789";
    	
        System.out.println("Stringa non processata: \"" + orig+"\";");
    	
        String mod_2;
    	
        mod_2 = orig.replaceAll("/","");             // Elimina carattere /
        mod_2 = mod_2.replaceAll("-","");         // Elimina carattere -
        mod_2 = mod_2.replaceAll("\\+","00");   // Elimina carattere +
        mod_2 = mod_2.replaceAll("^\\s+", "");  // Elimina spazi all'inizio della stringa
        mod_2 = mod_2.replaceAll("\\s+$", "");  // Elimina spazi alla fine della stringa
        mod_2 = mod_2.replaceAll("\\b\\s{1,}\\b", ""); // Elimina spazi singoli e multipli all'interno della stringa
    
        System.out.println("Stringa mod_2: \"" + mod_2 +"\";");
    
        int mod_2_int = -1;	
        try
        {
            mod_2_int = Integer.parseInt(mod_2);  
        }
        catch (NumberFormatException nfe){
    	nfe.printStackTrace();
        }	
    
        System.out.println("Stringa mod_2 convertita in intero: \"" + mod_2_int +"\";");	
      }	
    }
    Se la stringa origin è " 0123 456789" l'output del programma è il seguente:

    Stringa non processata: " 0123 456789";
    Stringa mod_2: "0123456789";
    Stringa mod_2 convertita in intero: "123456789";
    Se la stringa origin è "+39 0123 456789" l'output del programma è il seguente:

    Stringa non processata: "+39 0123 456789";
    Stringa mod_2: "00390123456789";
    java.lang.NumberFormatException: For input string: "00390123456789"
    at java.lang.NumberFormatException.forInputString(Unk nown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at Rimpiazza.main(Rimpiazza.java:26)
    Stringa mod_2 convertita in intero: "-1";
    Secondo voi perchè si verifica questo errore? C'è un modo per evitarlo? E se si, quale? Vi prego, aiutatemi, sono in crisi nera.

  2. #2
    Il massimo intero positivo rappresentabile dal tipo primitivo int di Java è: 2147483647
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    una considerazione: da dove prendi la stringa? Tu supponi che la suddivisione venga fatta per /, - oppure blank, ma sei in grado di fissare un formato standard (es separatore blank) e lavorare su quello?
    In tal caso la stesura dell'algoritmo è molto più semplice.

    Poi in generale se è un numero di telefono, puoi
    +39 0123 4567
    codice:
    StringBuffer buffer = new StringBuffer("");
    if (str.startsWith("+39")){
      str = str.substring(3).trim();
      buffer.append("00");
    }
    e fin qui ti trovi a lavorare con

    0123 4567

    e hai in buffer già 00

    poi fai uno split per blank

    codice:
    String tmp[] = str.split(" ");
    if (tmp != null && tmp.length > 0){
       for (String tmps : tmp) buffer.append(tmps);
    }
    e in buffer hai alla fine

    0001234567
    poi non so che senso abbia un numero di telefono convertito in intero (al max long), in genere lo si lascia in formato stringa visto che in questo caso ti perderesti lo 0 iniziale del numero

  4. #4
    GENIALE!

    Ho usato long invece che int ed ovviamente ha funzionato alla perfezione. Spero solo di non avere mai a che fare con numeri telefonici che vadano oltre il range del tipo long, ovvero lunghi più di 21 cifre...

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    ripeto concettualmente è errato perché tu il numero

    +39 011 1234 5678

    diventa prima

    003901112345678

    e poi

    3901112345678

    un numero che non tiene conto del prefisso internazionale (che sarebbe 0039 e non 39) e pone limiti sulla dimensione (ovviamente quanti ne può contenere un long).

    Per queste due ragioni parlando di numeri telefonici si MANTIENE lo stesso in formato stringa.

  6. #6
    Originariamente inviato da valia
    una considerazione: da dove prendi la stringa? Tu supponi che la suddivisione venga fatta per /, - oppure blank, ma sei in grado di fissare un formato standard (es separatore blank) e lavorare su quello?
    In tal caso la stesura dell'algoritmo è molto più semplice.

    Poi in generale se è un numero di telefono, puoi
    +39 0123 4567
    codice:
    StringBuffer buffer = new StringBuffer("");
    if (str.startsWith("+39")){
      str = str.substring(3).trim();
      buffer.append("00");
    }
    e fin qui ti trovi a lavorare con

    0123 4567

    e hai in buffer già 00

    poi fai uno split per blank

    codice:
    String tmp[] = str.split(" ");
    if (tmp != null && tmp.length > 0){
       for (String tmps : tmp) buffer.append(tmps);
    }
    e in buffer hai alla fine

    0001234567
    poi non so che senso abbia un numero di telefono convertito in intero (al max long), in genere lo si lascia in formato stringa visto che in questo caso ti perderesti lo 0 iniziale del numero
    Ciao, grazie mille per la risposta esauriente. Mi sento in dovere di darti delle spiegazioni. Dunque, lo scopo di un altro mio programma è quello di avviare una telefonata inserendo il numero di telefono in una web form. Ovviamente, per ridurre i tempi di inserimento del numero, un utente potrebbe trovare il numero di telefono in un altro sito web e decidere di copiarlo, solo che nei siti web i numeri di telefono sono scritti come nell'esempio sopra o separati da - o /. Per avviare la telefonata devo inviare il numero telefonico sotto forma di stringa a un PBX software e devo avere una stringa telefonicamente "valida", ovvero, senza spazi o caratteri speciali. A questo punto prima elimino i caratteri tipo / o - e converto il + in 00 per ottenere la stringa telefonicamente valida, poi opero la conversione in long esclusivamente per vedere se la stringa contiene solo numeri. Se l'operazione fallisce, vuol dire che il numero telefonico non è valido e quindi non parte la chiamata; se invece il numero telefonico è valido, allora la chiamata può partire e invio quindi la stringa telefonica corretta. Per questo non mi interessa se l'operazione di conversione da stringa a numero si "mangia" gli 0 iniziali, tanto mi serve solo per un confronto e nulla più!

    Ciao e ancora grazie a tutti!

  7. #7
    Originariamente inviato da valia
    ripeto concettualmente è errato perché tu il numero

    +39 011 1234 5678

    diventa prima

    003901112345678

    e poi

    3901112345678

    un numero che non tiene conto del prefisso internazionale (che sarebbe 0039 e non 39) e pone limiti sulla dimensione (ovviamente quanti ne può contenere un long).

    Per queste due ragioni parlando di numeri telefonici si MANTIENE lo stesso in formato stringa.
    Ti ho appena risposto nella mail precedente. Il numero convertito in long mi serve esclusivamente per vedere se ho inserito un numero telefonico corretto, poi al PBX passo la stringa contenente gli 0 iniziali. Non sono riuscito a rispondere più in fretta al messaggio precedente in quanto ero impegnato al telefono. Colpa mia. Scusa.

    Ciao

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    questo stesso risultato si ottiene con diversi metodi (senza usare la NumberFormatException): stai dando un ruolo sbagliato all'eccezione.

    Puoi banalmente verificare che la tua stringa sia composta SOLO da numeri e/o da caratteri come +, /, - e spazi utilizzando le regex: se la stringa corrisponde ai requisiti hai ok, altrimenti ti fermi e richiedi l'inserimento di una stringa corretta.

    Inoltre in genere il numero di telefono viene gestito (per comodità) con 3 campi:

    1. combobox con i prefissi internazionali
    2. textbox che accetta solo numeri (il prefisso)
    3. textbox che accetta solo numeri (il numero effettivo)

    da qui si deduce che puoi premendo ok (o chiama) controlli se hai una stringa valida (lunghezza maggiore di zero) se si la componi prendendo il valore dai 3 elementi, altrimenti ti fermi.

    Questa resta per me la soluzione migliore per la scrittura di un numero di telefono.
    Ora esigenze del cliente particolari ti portano a questo giro e a complicarti, inutilmente, la vita.
    Non che non si possa fare come dici tu, utilizza gli strumenti del linguaggio in modo corretto: l'eccezione è fatta per segnalare situazioni ANOMALE di esecuzione, non per regolare il normale flusso di esecuzione (come stai facendo tu)

  9. #9
    Originariamente inviato da valia
    questo stesso risultato si ottiene con diversi metodi (senza usare la NumberFormatException): stai dando un ruolo sbagliato all'eccezione.

    Puoi banalmente verificare che la tua stringa sia composta SOLO da numeri e/o da caratteri come +, /, - e spazi utilizzando le regex: se la stringa corrisponde ai requisiti hai ok, altrimenti ti fermi e richiedi l'inserimento di una stringa corretta.

    Inoltre in genere il numero di telefono viene gestito (per comodità) con 3 campi:

    1. combobox con i prefissi internazionali
    2. textbox che accetta solo numeri (il prefisso)
    3. textbox che accetta solo numeri (il numero effettivo)

    da qui si deduce che puoi premendo ok (o chiama) controlli se hai una stringa valida (lunghezza maggiore di zero) se si la componi prendendo il valore dai 3 elementi, altrimenti ti fermi.

    Questa resta per me la soluzione migliore per la scrittura di un numero di telefono.
    Ora esigenze del cliente particolari ti portano a questo giro e a complicarti, inutilmente, la vita.
    Non che non si possa fare come dici tu, utilizza gli strumenti del linguaggio in modo corretto: l'eccezione è fatta per segnalare situazioni ANOMALE di esecuzione, non per regolare il normale flusso di esecuzione (come stai facendo tu)
    Hai perfettamente ragione, ma, come si poteva intuire dal mio errore iniziale, sono ancora abbastanza carente in Java. Effettivamente potrei prima modificare la stringa per rimuovere "-", " " e "/", modificare il "+" in "00" e quindi scorrere i caratteri della stringa e verificare con isDigit() se siano dei numeri o meno e quindi evitare di usare l'eccezione. Allungo un po' il codice, ma almeno lo rendo corretto. Grazie mille.

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da classiFICO
    Hai perfettamente ragione, ma, come si poteva intuire dal mio errore iniziale, sono ancora abbastanza carente in Java. Effettivamente potrei prima modificare la stringa per rimuovere "-", " " e "/", modificare il "+" in "00" e quindi scorrere i caratteri della stringa e verificare con isDigit() se siano dei numeri o meno e quindi evitare di usare l'eccezione. Allungo un po' il codice, ma almeno lo rendo corretto. Grazie mille.
    boh secondo me continui a complicarti la vita e a scrivere algoritmi altamente inefficienti (visto che ogni replace crea una nuova stringa), a sto punto scriviti una regex come si deve, ma tenere conto di tutti i modi con cui una persona può specificare il numero di telefono non è banale (ergo le soluzioni adottate da tutti: forzare ad un formato ottimizzato per lo sviluppatore)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.