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