\r
private int floatDigits;\r
private int doubleDigits;\r
+ private double lowLimit;\r
+ private double highLimit;\r
private DecimalFormatSymbols decimalFormatSymbols;\r
\r
private DecimalFormat flow;\r
public FormattingUtil(int floatDigits, int doubleDigits) {\r
this(floatDigits, doubleDigits, Locale.getDefault());\r
}\r
-\r
+ \r
public FormattingUtil(int floatDigits, int doubleDigits, Locale locale) {\r
- this.floatDigits = floatDigits;\r
+ this(floatDigits, doubleDigits, 0.01, 1e6, locale);\r
+ }\r
+\r
+ public FormattingUtil(int floatDigits, int doubleDigits, double lowLimit, double highLimit, Locale locale) {\r
+ this.floatDigits = floatDigits;\r
this.doubleDigits = doubleDigits;\r
- this.decimalFormatSymbols = DecimalFormatSymbols.getInstance(locale);\r
+ this.lowLimit = lowLimit;\r
+ this.highLimit = highLimit;\r
+ this.decimalFormatSymbols = DecimalFormatSymbols.getInstance(locale != null ? locale : Locale.getDefault());\r
initFormats();\r
}\r
\r
private void initFormats() {\r
this.flow = createLowFormat(floatDigits);\r
- this.fmiddles = createMiddleFormats(6, floatDigits);\r
+ double exp = Math.log10(highLimit);\r
+ int formatCount = Math.max(1, (int) Math.ceil(exp));\r
+ this.fmiddles = createMiddleFormats(formatCount, floatDigits);\r
this.fhigh = createHighFormat(floatDigits);\r
this.dlow = createLowFormat(doubleDigits);\r
- this.dmiddles = createMiddleFormats(6, doubleDigits);\r
+ this.dmiddles = createMiddleFormats(formatCount, doubleDigits);\r
this.dhigh = createHighFormat(doubleDigits);\r
}\r
\r
\r
private DecimalFormat createHighFormat(int digitCount) {\r
StringBuilder fmt = new StringBuilder();\r
- fmt.append("##0.");\r
+ fmt.append("##0");\r
+ if (digitCount > 3) fmt.append(".");\r
for (int i = 3; i < digitCount; ++i)\r
fmt.append('#');\r
fmt.append("E0");\r
return new DecimalFormat(fmt.toString(), decimalFormatSymbols);\r
}\r
\r
- private static DecimalFormat[] createMiddleFormats(int formatCount, int digitCount) {\r
- DecimalFormat[] middles = new DecimalFormat[6];\r
+ private DecimalFormat[] createMiddleFormats(int formatCount, int digitCount) {\r
+ DecimalFormat[] middles = new DecimalFormat[formatCount];\r
for (int exp10 = 0; exp10 < formatCount; ++exp10) {\r
StringBuilder fmt = new StringBuilder();\r
int digits = digitCount;\r
fmt.append('#');\r
fmt.append('0');\r
--digits;\r
- fmt.append('.');\r
+ if (digits > 0) fmt.append('.');\r
for (; digits > 0; --digits)\r
fmt.append('#');\r
//System.out.println(fmt.toString());\r
- middles[exp10] = new DecimalFormat(fmt.toString(), DecimalFormatSymbols.getInstance(Locale.US));\r
+ middles[exp10] = new DecimalFormat(fmt.toString(), decimalFormatSymbols);\r
}\r
return middles;\r
}\r
}\r
}\r
\r
- private String formatNumber(float v) {\r
+ public String formatNumber(float v) {\r
if (Float.isInfinite(v)) {\r
return (v == Float.POSITIVE_INFINITY) ? "\u221E" : "-\u221E";\r
} else if (Float.isNaN(v)) {\r
return "NaN";\r
} else {\r
float abs = Math.abs(v);\r
- if (abs < 1.0f && abs >= 0.01f) {\r
+ if (abs < 1.0f && abs >= (float)lowLimit) {\r
return flow.format(v);\r
- } else if (abs >= 1.0f && abs < 1e6f) {\r
+ } else if (abs >= 1.0f && abs < (float)highLimit) {\r
double exp = Math.log10(abs);\r
int expi = (int) Math.floor(exp);\r
// System.out.println("format(" + v + ")");\r
}\r
}\r
\r
- private String formatNumber(double v) {\r
+ public String formatNumber(double v) {\r
if (Double.isInfinite(v)) {\r
return (v == Double.POSITIVE_INFINITY) ? "\u221E" : "-\u221E";\r
} else if (Double.isNaN(v)) {\r
return "NaN";\r
} else {\r
double abs = Math.abs(v);\r
- if (abs < 1.0 && abs >= 0.01) {\r
+ if (abs < 1.0 && abs >= lowLimit) {\r
return dlow.format(v);\r
- } else if (abs >= 1.0 && abs < 1e6) {\r
+ } else if (abs >= 1.0 && abs < highLimit) {\r
double exp = Math.log10(abs);\r
int expi = (int) Math.floor(exp);\r
// System.out.println("format(" + v + ")");\r