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