Ho guardato in giro, ma non ho trovato nulla a riguardo, neanche con google.
Se non ricordo male c'era qualcosa tipo "####,##" che indicava il pattern di
formattazione.
Mi rinfrescate la memoria?
Ciao e grazie a tutti.
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;
...
DecimalFormat f = (DecimalFormat)NumberFormat.getInstance(Locale.US);
f.applyPattern(",##0.000") ;
f.format(number);
...
La documentazione è una merdata.
Cazzo un'esempio la Sun si poteva pure sprecare a mettercelo
Ciao
Laila
Bisogna purtroppo scriversi una classe....
Allego codice.
P.S.: Il pezzo importante è svolto da calcparm() che imposta mantissa
ed esponente.
Carlo.
/** Utility per stampare i numeri in dato formato.
* @version 1.0
* @author Carlo Pellegrini
*/
public class PrintNumber{
private double num; // numero originale
private boolean nan; // flag Not a Number
private boolean inf; // flag Infinito
private boolean neg; // flag Negativo
private double man; // mantissa n.nnnnnn.....
private int esp; // esponente
/** Imposta il numero da formattare.
* @param d numero da formattare
*/
public void setNumber(double d){
num=d;
calcparm();
}
/** Rende il numero formattato con notazione scientifica.
* @param maxint massimo numero di cifre per la parte intera
* @param maxdec massimo numero di cifre per la parte decimale
* @param trunc se true tronca gli zeri decimali al fondo
* @param alwaysdec se true mostra sempre almeno una cifra decimale
* @param alwaysexp se true mostra sempre notazione esponenziale
* @return stringa che rappresenta il numero
*/
public String toString(int maxint, int maxdec, boolean trunc,
boolean alwaysdec, boolean alwaysexp){
long tmpnum;
long tmpdiv;
long tmpint;
long tmpdec;
int tmpesp=esp;
StringBuffer out=new StringBuffer();
String tmpdecstr;
if ((tmpesp<=0)||(maxint<1)) maxint=1;
if (maxdec<0) maxdec=0;
if ((tmpesp>0)&&(tmpesp-maxint+1<0)) maxint=tmpesp+1;
tmpnum=(long)Math.round(Math.pow(10.0,maxint+maxdec-1)*man);
tmpesp=tmpesp-maxint+1;
tmpdiv=(long)Math.round(Math.pow(10.0,maxdec));
tmpint=tmpnum/tmpdiv;
tmpdec=tmpnum%tmpdiv;
if (trunc)
while (tmpdec%10==0) tmpdec=tmpdec/10;
if (neg) out.append("-");
out.append(Long.toString(tmpint));
if ((tmpdec>0)||(alwaysdec)){
out.append(".");
tmpdecstr=Long.toString(tmpdec);
for (int i=0;i<maxdec-tmpdecstr.length();i++)
out.append("0");
out.append(tmpdecstr);
}
if ((tmpesp!=0)||(alwaysexp)){
out.append("E");
out.append(Integer.toString(tmpesp));
}
return new String(out);
}
/** Rende il numero formattato con notazione ingegneristica.
* @param maxdec massimo numero di cifre per la parte decimale
* @param trunc se true tronca gli zeri decimali al fondo
* @param alwaysdec se true mostra sempre almeno una cifra decimale
* @param alwaysexp se true mostra sempre notazione esponenziale
* @return stringa che rappresenta il numero
*/
public String toSciString(int maxdec, boolean trunc,
boolean alwaysdec, boolean alwaysexp){
int maxint;
long tmpnum;
long tmpdiv;
long tmpint;
long tmpdec;
int tmpesp=esp;
StringBuffer out=new StringBuffer();
String tmpdecstr;
if (tmpesp>0)
maxint=tmpesp%3+1;
else
maxint=4+tmpesp%3;
if (maxint==4) maxint=1;
if (maxint<0) maxint=-maxint;
if (maxdec<0) maxdec=0;
tmpnum=(long)Math.round(Math.pow(10.0,maxint+maxdec-1)*man);
tmpesp=tmpesp-maxint+1;
tmpdiv=(long)Math.round(Math.pow(10.0,maxdec));
tmpint=tmpnum/tmpdiv;
tmpdec=tmpnum%tmpdiv;
if (neg) out.append("-");
out.append(Long.toString(tmpint));
if (tmpdec>0){
out.append(".");
if (trunc)
while (tmpdec%10==0){
tmpdec=tmpdec/10;
maxdec=maxdec-1;
};
tmpdecstr=Long.toString(tmpdec);
for (int i=0;i<maxdec-tmpdecstr.length();i++)
out.append("0");
out.append(tmpdecstr);
}else if(alwaysdec){
out.append(".");
if (trunc) maxdec=1;
for (int i=0;i<maxdec;i++)
out.append("0");
}
if ((tmpesp!=0)||(alwaysexp)){
out.append("E");
out.append(Integer.toString(tmpesp));
}
return new String(out);
}
// Calcola i parametri per la visualizzazione del numero
private void calcparm(){
double tmp=0.0;
nan=false;
inf=false;
neg=false;
man=0.0;
esp=0;
if (nan=Double.isNaN(num)) return;
if (num==0.0) return;
if (num<0){
neg=true;
tmp=-num;
}else{
tmp=num;
};
if (inf=Double.isInfinite(num)){
return;
}
if ((tmp<=1E7)&&(tmp>=1E-3)){
esp=-11;
tmp=tmp*1E11;
}
String tmps=Double.toString(tmp).toUpperCase();
int iesp=tmps.indexOf('E');
man=Double.valueOf(tmps.substring(0,iesp)).doubleValue();
esp+=Double.valueOf(tmps.substring(iesp+1,tmps.length())).intValue();
}
}
Io ho utilizzato queste classi piu' volte, in progetti
reali, senza dover ricorrere ad altri espedienti.
(Devo pero' ammettere che non si trattava di applicazioni
di calcolo, ma di tipo gestionali)
Saluti
Roberto
--
+---------------------------+
| Roberto Bagnoli |
| robe...@comune.modena.it |
+---------------------------+