1 package com.sharkysoft.printf; 2 3 import com.sharkysoft.math.MantissaExponent; 4 import com.sharkysoft.math.MathToolbox; 5 import com.sharkysoft.printf.engine.RealFormatter; 6 7 class Formatter_g extends Formatter_e 8 { 9 10 Formatter_g(final FormatSpecifier ipPfs) 11 { 12 super(ipPfs); 13 final RealFormatter vpRf = (RealFormatter) mpFormatter; 14 if (ipPfs.mnPrecision == FormatSpecifier.PRECISION_UNSPECIFIED) 15 vpRf.setSigDigits(6); 16 else 17 vpRf.setSigDigits(ipPfs.mnPrecision); 18 vpRf.setMinRightDigits(0); 19 vpRf.setMaxRightDigits(0); 20 } 21 22 protected final boolean shouldUseScientific(final MantissaExponent ipSnbd) 23 { 24 final int vnPrecision = ((RealFormatter) mpFormatter).getMaxRightDigits(); 25 final int vnExponent = ipSnbd.getExponent(); 26 return vnExponent > vnPrecision || vnExponent < -4; 27 } 28 29 protected void adjustPrecision(final PrintfState ipPs) 30 { 31 if (mzVariablePrecision) 32 { 33 final RealFormatter vpRf = (RealFormatter) mpFormatter; 34 vpRf.setSigDigits(((Number) ipPs.mapArgs[ipPs.mnArgIndex++]).intValue()); 35 } 36 } 37 38 protected void adjustWidthAndPrecision(final PrintfState ipPs) 39 { 40 adjustWidth(ipPs); 41 if (mzVariablePrecision) 42 ( (RealFormatter) mpFormatter 43 ).setMaxRightDigits 44 ( ((Number) ipPs.mapArgs[ipPs.mnArgIndex++]).intValue() 45 ); 46 } 47 48 void format(final PrintfState ipPs) 49 { 50 adjustWidthAndPrecision(ipPs); 51 if 52 ( shouldUseScientific 53 ( MathToolbox.toScientificNotation 54 ( ((Number) ipPs.mapArgs[ipPs.mnArgIndex]).floatValue() 55 ) 56 ) 57 ) 58 formatFloatScientific(ipPs); 59 else 60 formatFloat(ipPs); 61 } 62 63 } 64