1 package org.simantics.datatypes.literal;
\r
3 import java.text.DecimalFormat;
\r
4 import java.text.DecimalFormatSymbols;
\r
5 import java.util.Locale;
\r
7 import org.simantics.common.format.Formatter;
\r
8 import org.simantics.databoard.Bindings;
\r
9 import org.simantics.databoard.binding.Binding;
\r
10 import org.simantics.databoard.util.Bean;
\r
13 public class DecimalFormatFormatter extends Bean implements Formatter {
\r
15 public static final Binding BINDING = Bindings.getBindingUnchecked(DecimalFormatFormatter.class);
\r
17 public String formatString;
\r
19 private volatile DecimalFormat format;
\r
21 public DecimalFormatFormatter() {
\r
22 this("0.###############");
\r
25 public DecimalFormatFormatter(String formatString) {
\r
26 if (formatString == null)
\r
27 throw new NullPointerException("null formatString");
\r
28 this.formatString = formatString;
\r
31 public DecimalFormat getFormat() {
\r
32 if(format == null) {
\r
33 format = new java.text.DecimalFormat(formatString, DecimalFormatSymbols.getInstance(Locale.US));
\r
39 public String format(Object object) {
\r
40 if (object instanceof String) return object.toString();
\r
41 else if (object instanceof Number) {
\r
43 DecimalFormat format = getFormat();
\r
44 // System.out.println("formatString: " + formatString);
\r
45 int integers = format.getMaximumIntegerDigits();
\r
46 //System.out.println(" integers: " + integers);
\r
47 if (integers == Integer.MAX_VALUE) {
\r
48 // Parse number of integer digits from format string.
\r
49 integers = countIntegerDigits(formatString);
\r
51 //System.out.println(" decimals: " + format.getMaximumFractionDigits());
\r
52 //System.out.println(" integers: " + format.getMinimumIntegerDigits());
\r
53 //System.out.println(" decimals: " + format.getMinimumFractionDigits());
\r
54 String result = format.format(object);
\r
55 //System.out.println("result: " + result);
\r
56 int resultIntegers = countResultDigits(result);
\r
57 //System.out.println(" result integers: " + resultIntegers);
\r
58 if (resultIntegers > integers) {
\r
59 // Guard against format.getMaximumFractionDigits returning Integer.MAX_VALUE
\r
60 int decimals = Math.min(format.getMaximumFractionDigits(), 15);
\r
61 return getLimitString(integers, decimals);
\r
65 return object != null ? object.toString() : "";
\r
69 private int countIntegerDigits(String formatString) {
\r
71 int len = formatString.length();
\r
72 boolean escape = false;
\r
73 for (int i = 0; i < len; ++i) {
\r
74 char ch = formatString.charAt(i);
\r
77 else if (ch == '\'')
\r
79 else if (!escape && (ch == '#' || ch == '0'))
\r
85 private int countResultDigits(String formattedString) {
\r
87 int len = formattedString.length();
\r
88 for (int i = 0; i < len; ++i) {
\r
89 char ch = formattedString.charAt(i);
\r
92 else if (Character.isDigit(ch))
\r
98 private String getLimitString(int integers, int decimals) {
\r
99 StringBuilder b = new StringBuilder(integers + decimals + 1);
\r
100 for(int i=0;i<integers;i++) b.append('*');
\r
102 for(int i=0;i<decimals;i++) b.append('*');
\r
103 return b.toString();
\r