]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.utils/src/org/simantics/utils/format/FormattingUtils.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.utils / src / org / simantics / utils / format / FormattingUtils.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.utils.format;\r
13 \r
14 import java.math.BigDecimal;\r
15 import java.math.MathContext;\r
16 import java.text.DecimalFormat;\r
17 import java.text.DecimalFormatSymbols;\r
18 import java.text.FieldPosition;\r
19 import java.text.Format;\r
20 import java.text.NumberFormat;\r
21 import java.text.ParsePosition;\r
22 import java.util.Locale;\r
23 \r
24 /**\r
25  * @author Antti Villberg\r
26  */\r
27 public class FormattingUtils {\r
28 \r
29     public static final FormattingUtil US      = new FormattingUtil(5, 5, Locale.US);\r
30     public static final FormattingUtil DEFAULT = US;\r
31 \r
32     public static String engineeringFormat(Object value) {\r
33         return DEFAULT.engineeringFormat(value);\r
34     }\r
35 \r
36     public static Format significantDigitFormat(int withSignificantDigits) {\r
37         return significantDigitFormat(withSignificantDigits, false);\r
38     }\r
39 \r
40     public static Format significantDigitFormat(int withSignificantDigits, boolean stripTrailingZeros) {\r
41         if (withSignificantDigits < 1)\r
42             throw new IllegalArgumentException("withSignificantDigits must be > 0, got " + withSignificantDigits);\r
43         StringBuilder sb = new StringBuilder(withSignificantDigits + 3);\r
44         sb.append("0.");\r
45         for (int i = 0; i < withSignificantDigits-1; i++)\r
46             sb.append("#");\r
47         sb.append("E0");\r
48         NumberFormat low = new DecimalFormat(sb.toString());\r
49         low.setGroupingUsed(false);\r
50         NumberFormat hi = new SignificantDigitFormat(withSignificantDigits, stripTrailingZeros);\r
51         Format format = new SwitchFormat(0.1, 1, low, hi, hi);\r
52         return format;\r
53     }\r
54 \r
55     private static class SignificantDigitFormat extends NumberFormat {\r
56 \r
57         private static final long serialVersionUID = 1079268918077141671L;\r
58 \r
59         private MathContext mc;\r
60         private boolean stripTrailingZeros;\r
61         private boolean fixDecimalSeparator;\r
62         private char decimalSeparator;\r
63 \r
64         public SignificantDigitFormat(int digits, boolean stripTrailingZeros) {\r
65             this.mc = new MathContext(digits);\r
66             this.stripTrailingZeros = stripTrailingZeros;\r
67             DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance();\r
68             decimalSeparator = symbols.getDecimalSeparator();\r
69             // BigDecimal always formats doubles with '.' as decimal separator.\r
70             if (decimalSeparator != '.')\r
71                 fixDecimalSeparator = true;\r
72             else\r
73                 fixDecimalSeparator = false;\r
74         }\r
75 \r
76         @Override\r
77         public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) {\r
78             BigDecimal big = new BigDecimal(number, mc);\r
79             if (stripTrailingZeros)\r
80                 big = big.stripTrailingZeros();\r
81             String str = big.toString();\r
82             if (fixDecimalSeparator)\r
83                 str = str.replace('.', decimalSeparator);\r
84             return toAppendTo.append(str);\r
85         }\r
86 \r
87         @Override\r
88         public StringBuffer format(long number, StringBuffer toAppendTo, FieldPosition pos) {\r
89             return toAppendTo.append(number);\r
90         }\r
91 \r
92         @Override\r
93         public Number parse(String source, ParsePosition parsePosition) {\r
94             return 0;\r
95         }\r
96 \r
97     }\r
98 \r
99 }\r