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