X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.utils%2Fsrc%2Forg%2Fsimantics%2Futils%2Fformat%2FFormattingUtil.java;h=a1a525d80f19ad735bf42c72698032a6d6159208;hp=ae17537f02f3a9fe2ecad21183bb948a1ecee5d1;hb=55ca14c;hpb=3b5069d0d30e7de27f73d88d5e89d29052291a34 diff --git a/bundles/org.simantics.utils/src/org/simantics/utils/format/FormattingUtil.java b/bundles/org.simantics.utils/src/org/simantics/utils/format/FormattingUtil.java index ae17537f0..a1a525d80 100644 --- a/bundles/org.simantics.utils/src/org/simantics/utils/format/FormattingUtil.java +++ b/bundles/org.simantics.utils/src/org/simantics/utils/format/FormattingUtil.java @@ -25,6 +25,8 @@ public class FormattingUtil { private int floatDigits; private int doubleDigits; + private double lowLimit; + private double highLimit; private DecimalFormatSymbols decimalFormatSymbols; private DecimalFormat flow; @@ -38,20 +40,28 @@ public class FormattingUtil { public FormattingUtil(int floatDigits, int doubleDigits) { this(floatDigits, doubleDigits, Locale.getDefault()); } - + public FormattingUtil(int floatDigits, int doubleDigits, Locale locale) { - this.floatDigits = floatDigits; + this(floatDigits, doubleDigits, 0.01, 1e6, locale); + } + + public FormattingUtil(int floatDigits, int doubleDigits, double lowLimit, double highLimit, Locale locale) { + this.floatDigits = floatDigits; this.doubleDigits = doubleDigits; - this.decimalFormatSymbols = DecimalFormatSymbols.getInstance(locale); + this.lowLimit = lowLimit; + this.highLimit = highLimit; + this.decimalFormatSymbols = DecimalFormatSymbols.getInstance(locale != null ? locale : Locale.getDefault()); initFormats(); } private void initFormats() { this.flow = createLowFormat(floatDigits); - this.fmiddles = createMiddleFormats(6, floatDigits); + double exp = Math.log10(highLimit); + int formatCount = Math.max(1, (int) Math.ceil(exp)); + this.fmiddles = createMiddleFormats(formatCount, floatDigits); this.fhigh = createHighFormat(floatDigits); this.dlow = createLowFormat(doubleDigits); - this.dmiddles = createMiddleFormats(6, doubleDigits); + this.dmiddles = createMiddleFormats(formatCount, doubleDigits); this.dhigh = createHighFormat(doubleDigits); } @@ -66,7 +76,8 @@ public class FormattingUtil { private DecimalFormat createHighFormat(int digitCount) { StringBuilder fmt = new StringBuilder(); - fmt.append("##0."); + fmt.append("##0"); + if (digitCount > 3) fmt.append("."); for (int i = 3; i < digitCount; ++i) fmt.append('#'); fmt.append("E0"); @@ -74,8 +85,8 @@ public class FormattingUtil { return new DecimalFormat(fmt.toString(), decimalFormatSymbols); } - private static DecimalFormat[] createMiddleFormats(int formatCount, int digitCount) { - DecimalFormat[] middles = new DecimalFormat[6]; + private DecimalFormat[] createMiddleFormats(int formatCount, int digitCount) { + DecimalFormat[] middles = new DecimalFormat[formatCount]; for (int exp10 = 0; exp10 < formatCount; ++exp10) { StringBuilder fmt = new StringBuilder(); int digits = digitCount; @@ -83,11 +94,11 @@ public class FormattingUtil { fmt.append('#'); fmt.append('0'); --digits; - fmt.append('.'); + if (digits > 0) fmt.append('.'); for (; digits > 0; --digits) fmt.append('#'); //System.out.println(fmt.toString()); - middles[exp10] = new DecimalFormat(fmt.toString(), DecimalFormatSymbols.getInstance(Locale.US)); + middles[exp10] = new DecimalFormat(fmt.toString(), decimalFormatSymbols); } return middles; } @@ -145,16 +156,16 @@ public class FormattingUtil { } } - private String formatNumber(float v) { + public String formatNumber(float v) { if (Float.isInfinite(v)) { return (v == Float.POSITIVE_INFINITY) ? "\u221E" : "-\u221E"; } else if (Float.isNaN(v)) { return "NaN"; } else { float abs = Math.abs(v); - if (abs < 1.0f && abs >= 0.01f) { + if (abs < 1.0f && abs >= (float)lowLimit) { return flow.format(v); - } else if (abs >= 1.0f && abs < 1e6f) { + } else if (abs >= 1.0f && abs < (float)highLimit) { double exp = Math.log10(abs); int expi = (int) Math.floor(exp); // System.out.println("format(" + v + ")"); @@ -168,16 +179,16 @@ public class FormattingUtil { } } - private String formatNumber(double v) { + public String formatNumber(double v) { if (Double.isInfinite(v)) { return (v == Double.POSITIVE_INFINITY) ? "\u221E" : "-\u221E"; } else if (Double.isNaN(v)) { return "NaN"; } else { double abs = Math.abs(v); - if (abs < 1.0 && abs >= 0.01) { + if (abs < 1.0 && abs >= lowLimit) { return dlow.format(v); - } else if (abs >= 1.0 && abs < 1e6) { + } else if (abs >= 1.0 && abs < highLimit) { double exp = Math.log10(abs); int expi = (int) Math.floor(exp); // System.out.println("format(" + v + ")");