]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.datatypes/src/org/simantics/datatypes/literal/DecimalFormatFormatter.java
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.datatypes / src / org / simantics / datatypes / literal / DecimalFormatFormatter.java
1 package org.simantics.datatypes.literal;
2
3 import java.text.DecimalFormat;
4 import java.text.DecimalFormatSymbols;
5 import java.util.Locale;
6
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;
11
12
13 public class DecimalFormatFormatter extends Bean implements Formatter {
14
15         public static final Binding BINDING = Bindings.getBindingUnchecked(DecimalFormatFormatter.class);
16
17         public String formatString;
18
19         private volatile DecimalFormat format;
20
21         public DecimalFormatFormatter() {
22                 this("0.###############");
23         }
24
25         public DecimalFormatFormatter(String formatString) {
26                 if (formatString == null)
27                         throw new NullPointerException("null formatString");
28                 this.formatString = formatString;
29         }
30         
31         public DecimalFormat getFormat() {
32                 if(format == null) {
33                         format = new java.text.DecimalFormat(formatString, DecimalFormatSymbols.getInstance(Locale.US));
34                 }
35                 return format;
36         }
37
38         @Override
39         public String format(Object object) {
40                 if (object instanceof String) return object.toString();
41                 else if (object instanceof Number) {
42
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);
50                         }
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);
62                         }
63                         return result; 
64                 } else {
65                         return object != null ? object.toString() : "";
66                 }
67         }       
68         
69         private int countIntegerDigits(String formatString) {
70                 int digits = 0;
71                 int len = formatString.length();
72                 boolean escape = false;
73                 for (int i = 0; i < len; ++i) {
74                         char ch = formatString.charAt(i);
75                         if (ch == '.')
76                                 break;
77                         else if (ch == '\'')
78                                 escape = true;
79                         else if (!escape && (ch == '#' || ch == '0'))
80                                 ++digits;
81                 }
82                 return digits;
83         }
84
85         private int countResultDigits(String formattedString) {
86                 int digits = 0;
87                 int len = formattedString.length();
88                 for (int i = 0; i < len; ++i) {
89                         char ch = formattedString.charAt(i);
90                         if (ch == '.')
91                                 break;
92                         else if (Character.isDigit(ch))
93                                 ++digits;
94                 }
95                 return digits;
96         }
97         
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('*');
101                 b.append('.');
102                 for(int i=0;i<decimals;i++) b.append('*');
103                 return b.toString();
104         }
105         
106 }