Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Problemino Con BigDecimal

138 views
Skip to first unread message

TelespallaBob

unread,
Nov 6, 2001, 7:05:38 AM11/6/01
to
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.


Laila Paganelli

unread,
Nov 6, 2001, 8:30:19 AM11/6/01
to
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);
...

TelespallaBob

unread,
Nov 6, 2001, 9:22:16 AM11/6/01
to
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


Laila Paganelli

unread,
Nov 6, 2001, 9:57:29 AM11/6/01
to
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

Carlo

unread,
Nov 6, 2001, 11:48:58 AM11/6/01
to

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();
}
}

TelespallaBob

unread,
Nov 7, 2001, 2:55:51 AM11/7/01
to
Very mille grazie a tutti.


Roberto Bagnoli

unread,
Nov 7, 2001, 3:29:15 AM11/7/01
to
Carlo wrote:
>
> On Tue, 6 Nov 2001 15:22:16 +0100, "TelespallaBob"
> <santo...@ciaoweb.it> wrote:
>
> >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
> >
> Bisogna purtroppo scriversi una classe....
> ...
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 |
+---------------------------+

0 new messages