Newsgroup: it.comp.java
Titolo: Problemino Con BigDecimal

Ragazzi, non mi ricordo come si fa a dire a questo Oggetto, quante sono le
cifre decimali che voglio e quante quelle Intere.
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.

Non so se è esattamente questo quello che cercavi, ma è l'unico modo che
ho trovato io per definire quante cifre decimali visualizzare e in quale
formato.
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);
...


Ma a te funziona?
Io ho provato questo, il NumberFormat etc.
Niente, non funzionano
La documentazione è una merdata.
Cazzo un'esempio la Sun si poteva pure sprecare a mettercelo

Ho impostato il formato solo quando visualizzo il risultato finale
nell'interfaccia ... e quindi funziona...
Non sono riuscita però a fare i calcoli impostando il numero di cifre
decimali che volevo considerare.
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();
    }
}

Very mille grazie a tutti.

 ...
Scusate se intervengo (puo' anche essere che io non conosca a fondo 
l'argomento), ma perche' scrivere una classe nuova quando:
o) java.math.BigDecimal permette di gestire un numero arbitrario di
   cifre significative e relative operazioni (con 8 diversi metodi 
   di arrotondamento)
o) java.text.DecimalFormat che permette di formattare
   i numeri nel modo piu' conveniente (anche in notazione
   esponenziale), semplicemente definendo una opportuna
   stringa di formattazione
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
 |
+---------------------------+