Newsgroup: it.comp.java
Titolo: formattare una percentuale

Non capisco perch� non ottengo 0,772 ( con la virgola) quando formatto  la 
stringa "77,2%"  che contiene la virgola:
 
 
NumberFormat pf = NumberFormat.getPercentInstance(Locale.ITALIAN);
try {
System.out.println( pf.parse("77,2%") ); // ottengo "0.772"
System.out.println( pf.parse("77.2%") ); //ottengo  "7.72"
}
catch (ParseException e) {}
 
 
Grazie 
 
 


Il separatore decimale del Locale.ITALIAN e' la virgola.
In quel caso presumo venga ignorato il punto e trasforma 772% che da 7.72.
Se vuoi usare il punto usa l'americano, altrimenti fai un replace del carattere.

 stringa "77,2%"  che contiene la virgola:
pf.parse restituisce Number, println esegue toString del Number, 
inconsapevole della locale.
Per formattare con la virgola devi usare un numberformat ulteriore 
localizzato.
NumberFormat pf = NumberFormat.getPercentInstance(Locale.ITALIAN);
NumberFormat nf = NumberFormat.getInstance(Locale.ITALIAN);
try {
   Object n = pf.parse("77,20%");
   System.out.println(n.getClass().getSimpleName()); // cvd
   System.out.println(n); // formattato non localizzato
   System.out.println(nf.format(n)); // formattato localizzato
// ma anche
   System.out.println(String.format(Locale.ITALIAN, "%f", n));
// o meglio
   System.out.println(String.format(Locale.ITALIAN, "%04.3f", n));
} catch (ParseException e) {}
 
ottieni:
 
Double
0.772
0,772
0,772000
0,772
 


Scusami se mi permetto, non e' rivolto a te personalmente, ma 
soprattutto a tutti quelli che leggeranno questa thread: e' ridicolo.
 
P.S. l'op diceva che pur utilizzando una locale il numero non viene 
localizzato corrispondentemente, quindi intendeva che si aspettava la 
virgola anche nella rappresentazione del numero.

 virgola anche nella rappresentazione del numero
 
ho semplicemente capito male la domanda. Non mi sembra il caso di fare il bullo.
 


Ma quale bullo? Se dici pubblicamente che per formattare un numero 
bisogna utiizzare il metodo replace, e' ovvio che che anche i piu' 
timidi possano reagire.

 timidi possano reagire.
 
ma se non sai neanche di cosa stai parlando perché devi parlare a vanvera?
 

 localizzato.
 
ok,grazie.
 
PS:
 
stranamente nell'operazione inversa viene usata la virgola italiama, anche 
senza aver mai usato il  LOCALE italiano:
 
NumberFormat percf = NumberFormat.getPercentInstance();
percf.setMinimumFractionDigits(2);
System.out.println(percf.format(0.783));  // print  78,30%
 
e infatti scrive  78,30%  !
 
Chi gliel'ha detto di usare la virgola italiana nel risultato????
 
Mah!
 
Ciao 
 
 

 Chi gliel'ha detto di usare la virgola italiana nel risultato????
 
il locale di default della jvm, che a sua volta viene determinato dal 
sistema su cui gira.


NumberFormat.getPercentInstance(); chiama il metodo con la Locale 
utilizzando la Locale.getDefault() che a sua volta viene istanziata 
dalla jvm in base all'ambiente che avvia la vm, ma anche impostando le 
proprieta' relative, ad esempio:
java -Duser.language=en -Duser.region=en_US ...
 
Praticamente tutti i metodi/classi che utilizzano la Locale, se questa 
non viene specificata, utilizzano quella di default, String.format non 
fa eccezione. Se vuoi essere sicuro di utilizzare sempre una Locale 
specifica senza doverla indicare, utilizza il metodo Locale.setDefault.
 

 Non capisco perchè non ottengo 0,772 ( con la virgola) quando formatto 

perchè tu usi il NumberFormat per il parsing dell'input ma non per la 
formattazione dell'output. la println trasforma brutamente in stringa 
senza alcuna localizzazione.

 senza alcuna localizzazione.
 
Ho capito allora,quelle che ho scritto non sono quindi due procedure 
simmetriche,quindi danno giustamente risultati diversi.