-package org.simantics.datatypes.literal;\r
-\r
-import java.text.DecimalFormat;\r
-import java.text.DecimalFormatSymbols;\r
-import java.util.Locale;\r
-\r
-import org.simantics.common.format.Formatter;\r
-import org.simantics.databoard.Bindings;\r
-import org.simantics.databoard.binding.Binding;\r
-import org.simantics.databoard.util.Bean;\r
-\r
-\r
-public class DecimalFormatFormatter extends Bean implements Formatter {\r
-\r
- public static final Binding BINDING = Bindings.getBindingUnchecked(DecimalFormatFormatter.class);\r
-\r
- public String formatString;\r
-\r
- private volatile DecimalFormat format;\r
-\r
- public DecimalFormatFormatter() {\r
- this("0.###############");\r
- }\r
-\r
- public DecimalFormatFormatter(String formatString) {\r
- if (formatString == null)\r
- throw new NullPointerException("null formatString");\r
- this.formatString = formatString;\r
- }\r
- \r
- public DecimalFormat getFormat() {\r
- if(format == null) {\r
- format = new java.text.DecimalFormat(formatString, DecimalFormatSymbols.getInstance(Locale.US));\r
- }\r
- return format;\r
- }\r
-\r
- @Override\r
- public String format(Object object) {\r
- if (object instanceof String) return object.toString();\r
- else if (object instanceof Number) {\r
-\r
- DecimalFormat format = getFormat();\r
-// System.out.println("formatString: " + formatString);\r
- int integers = format.getMaximumIntegerDigits();\r
- //System.out.println(" integers: " + integers);\r
- if (integers == Integer.MAX_VALUE) {\r
- // Parse number of integer digits from format string.\r
- integers = countIntegerDigits(formatString);\r
- }\r
- //System.out.println(" decimals: " + format.getMaximumFractionDigits());\r
- //System.out.println(" integers: " + format.getMinimumIntegerDigits());\r
- //System.out.println(" decimals: " + format.getMinimumFractionDigits());\r
- String result = format.format(object);\r
- //System.out.println("result: " + result);\r
- int resultIntegers = countResultDigits(result);\r
- //System.out.println(" result integers: " + resultIntegers);\r
- if (resultIntegers > integers) {\r
- // Guard against format.getMaximumFractionDigits returning Integer.MAX_VALUE\r
- int decimals = Math.min(format.getMaximumFractionDigits(), 15);\r
- return getLimitString(integers, decimals);\r
- }\r
- return result; \r
- } else {\r
- return object != null ? object.toString() : "";\r
- }\r
- } \r
- \r
- private int countIntegerDigits(String formatString) {\r
- int digits = 0;\r
- int len = formatString.length();\r
- boolean escape = false;\r
- for (int i = 0; i < len; ++i) {\r
- char ch = formatString.charAt(i);\r
- if (ch == '.')\r
- break;\r
- else if (ch == '\'')\r
- escape = true;\r
- else if (!escape && (ch == '#' || ch == '0'))\r
- ++digits;\r
- }\r
- return digits;\r
- }\r
-\r
- private int countResultDigits(String formattedString) {\r
- int digits = 0;\r
- int len = formattedString.length();\r
- for (int i = 0; i < len; ++i) {\r
- char ch = formattedString.charAt(i);\r
- if (ch == '.')\r
- break;\r
- else if (Character.isDigit(ch))\r
- ++digits;\r
- }\r
- return digits;\r
- }\r
- \r
- private String getLimitString(int integers, int decimals) {\r
- StringBuilder b = new StringBuilder(integers + decimals + 1);\r
- for(int i=0;i<integers;i++) b.append('*');\r
- b.append('.');\r
- for(int i=0;i<decimals;i++) b.append('*');\r
- return b.toString();\r
- }\r
- \r
-}\r
+package org.simantics.datatypes.literal;
+
+import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
+import java.util.Locale;
+
+import org.simantics.common.format.Formatter;
+import org.simantics.databoard.Bindings;
+import org.simantics.databoard.binding.Binding;
+import org.simantics.databoard.util.Bean;
+
+
+public class DecimalFormatFormatter extends Bean implements Formatter {
+
+ public static final Binding BINDING = Bindings.getBindingUnchecked(DecimalFormatFormatter.class);
+
+ public String formatString;
+
+ private volatile DecimalFormat format;
+
+ public DecimalFormatFormatter() {
+ this("0.###############");
+ }
+
+ public DecimalFormatFormatter(String formatString) {
+ if (formatString == null)
+ throw new NullPointerException("null formatString");
+ this.formatString = formatString;
+ }
+
+ public DecimalFormat getFormat() {
+ if(format == null) {
+ format = new java.text.DecimalFormat(formatString, DecimalFormatSymbols.getInstance(Locale.US));
+ }
+ return format;
+ }
+
+ @Override
+ public String format(Object object) {
+ if (object instanceof String) return object.toString();
+ else if (object instanceof Number) {
+
+ DecimalFormat format = getFormat();
+// System.out.println("formatString: " + formatString);
+ int integers = format.getMaximumIntegerDigits();
+ //System.out.println(" integers: " + integers);
+ if (integers == Integer.MAX_VALUE) {
+ // Parse number of integer digits from format string.
+ integers = countIntegerDigits(formatString);
+ }
+ //System.out.println(" decimals: " + format.getMaximumFractionDigits());
+ //System.out.println(" integers: " + format.getMinimumIntegerDigits());
+ //System.out.println(" decimals: " + format.getMinimumFractionDigits());
+ String result = format.format(object);
+ //System.out.println("result: " + result);
+ int resultIntegers = countResultDigits(result);
+ //System.out.println(" result integers: " + resultIntegers);
+ if (resultIntegers > integers) {
+ // Guard against format.getMaximumFractionDigits returning Integer.MAX_VALUE
+ int decimals = Math.min(format.getMaximumFractionDigits(), 15);
+ return getLimitString(integers, decimals);
+ }
+ return result;
+ } else {
+ return object != null ? object.toString() : "";
+ }
+ }
+
+ private int countIntegerDigits(String formatString) {
+ int digits = 0;
+ int len = formatString.length();
+ boolean escape = false;
+ for (int i = 0; i < len; ++i) {
+ char ch = formatString.charAt(i);
+ if (ch == '.')
+ break;
+ else if (ch == '\'')
+ escape = true;
+ else if (!escape && (ch == '#' || ch == '0'))
+ ++digits;
+ }
+ return digits;
+ }
+
+ private int countResultDigits(String formattedString) {
+ int digits = 0;
+ int len = formattedString.length();
+ for (int i = 0; i < len; ++i) {
+ char ch = formattedString.charAt(i);
+ if (ch == '.')
+ break;
+ else if (Character.isDigit(ch))
+ ++digits;
+ }
+ return digits;
+ }
+
+ private String getLimitString(int integers, int decimals) {
+ StringBuilder b = new StringBuilder(integers + decimals + 1);
+ for(int i=0;i<integers;i++) b.append('*');
+ b.append('.');
+ for(int i=0;i<decimals;i++) b.append('*');
+ return b.toString();
+ }
+
+}