//
Formatage de valeurs numériques décimales en Java
// Formatage de valeurs numériques décimales
// Classe MonFormat et méthode formate
// La classe Format ne sert qu'à présentetr des exemples.
// Présentation de nombres déciamux, cadrés à droite, sur un nombre
// de colonnes choisi, et un nombre de chiffres dans la partie décimale,
// également choisi.
// La présentation avec mantisse et exposant est aussi définie.
//
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
public class Format {
Format () { }
public static void main(String []args) {
double d=9870.654321;
MonFormat mf;
/*
mf = new MonFormat(10);
System.out.println("Avec zéros en tête non significatifs");
mf.zeroDevant=true;
System.out.println(" "+ "1234567890"+" "+"1234567890");
System.out.println(" "+mf.formate(d)+" "+mf.formate(-123.5));
System.out.println("Cadrage correct");
mf.applyPattern("0.00E00");// mf.setMaximumIntegerDigits(2);
mf.zeroDevant=false;
System.out.println(" "+ "1234567890"+" "+"1234567890");
System.out.println(" "+mf.formate(d)+" "+mf.formate(-123.4));
System.out.println("Valeur négative plus longue");
mf = new MonFormat(7);
mf.applyPattern("0.00E00");// mf.setMaximumIntegerDigits(2);
System.out.println(" "+ "1234567"+" "+"1234567");
System.out.println(" "+mf.formate(d)+" "+mf.formate(-d));
System.out.println("4 chiffres après la virgule, cadrage correct");
mf = new MonFormat(11,4);
System.out.println(" "+"12345678901"+" "+"12345678901");
System.out.println(" "+mf.formate(d)+" "+mf.formate(-d));
System.out.println("Valeurs positive et négative plus longues");
mf = new MonFormat(8,4);
System.out.println(" "+ "12345678"+" "+"12345678");
System.out.println(" "+mf.formate(d)+" "+mf.formate(-d));
*/
mf = new MonFormat('E',11);
System.out.println(" "+mf.formate(d*1.e-5)+" "
+mf.formate(-123.4*1.e-5)+" "+mf.toPattern());
System.out.println(" "+mf.formate(d*1.e5)+" "
+mf.formate(-123.4*1.e5)+" "+mf.toPattern());
mf.zeroDevant=true;
System.out.println(" "+mf.formate(d*1.e-5)+" "
+mf.formate(-123.4*1.e-5)+" "+mf.toPattern());
mf = new MonFormat('E',11,4);
System.out.println(" "+mf.formate(d*1.e+5)+" "
+mf.formate(-1.4*1.e+5)+" "+mf.toPattern());
System.out.println(" "+mf.formate(d*1.e-5)+" "
+mf.formate(-1.4*1.e-5)+" "+mf.toPattern());
mf.zeroDevant=true;
System.out.println(" "+mf.formate(d*1.e+4)+" "
+mf.formate(-123.4*1.e+4)+" "+mf.toPattern());
}
}
/** Présentation de nombres déciamux, cadrés à droite, sur un nombre
de colonnes choisi, et un nombre de chiffres dans la partie décimale,
également choisi.
La présentation avec mantisse et exposant est aussi définie.
*/
class MonFormat extends DecimalFormat {
/** nb.chifres total minimum (la chaîne fournie peut être plus longue) */
int nTot;
/** nb.chifres dans la partie décimale */
int nDec;
/** si vrai, des zéros complètent à gauche; à éviter en notation scientifique
c'est à dire avec mantisse et exposant */
public boolean zeroDevant;
/** Notation fixe, 2 chiffres décimaux (après le '.')
exemple: 456.78 */
public MonFormat(int ntot) {
super("#.#");
init(ntot,2);
}
/** Notation fixee, ndec chiffres décimaux (après le '.')
exemple, avec ndec=4: -0.0456 */
public MonFormat(int ntot,int ndec) {
super("#.#");
init(ntot,ndec);
}
/** Notation scientifique, 2 chiffres décimaux; exposant: 2 chiffres
exemple: 3.14E+12 */
public MonFormat(char c,int ntot) {
super("0.00E00");
init(ntot,2);
}
/** Notation scientifique, ndec chiffres décimaux; exposant: 2 chiffres
exemple, avec ndec=4 : 3.1416E-03 */
public MonFormat(char c,int ntot,int ndec) {
super("0.00E00");
init(ntot,ndec);
}
private void init(int ntot, int ndec) {
nTot=(ntot<0)?0:ntot; nDec=(ndec<0)?2:ndec;
this.setMaximumFractionDigits(nDec);
this.setMinimumFractionDigits(nDec);
DecimalFormatSymbols fs = new DecimalFormatSymbols();
fs.setDecimalSeparator('.');
this.setDecimalFormatSymbols(fs);
zeroDevant=false;
}
public String formate(double d) {
String res=null;
if(zeroDevant) {
setMinimumIntegerDigits(nTot-(d<0?2:1)-nDec);
res=format(d);
setMinimumIntegerDigits(0);
}
else {
res=format(d);
int pos=res.indexOf("E");
if(pos>0 && res.charAt(1+pos)!='-') {
res=res.substring(0,pos)+"E+"+res.substring(pos+1,res.length());
}
int lres=res.length();
if(lres