1
2
3
4
5
6
7
8
9
10
11 package com.timjohnstondev.unitconverter.logic;
12
13 import java.math.BigDecimal;
14 import java.math.MathContext;
15 import java.math.RoundingMode;
16 import java.text.DecimalFormat;
17 import java.util.ResourceBundle;
18
19
20
21
22 public final class CalculationLogic
23 {
24 private static ResourceBundle resources = ResourceBundle.getBundle("com.timjohnstondev.unitconverter.view.View");
25
26 private CalculationLogic()
27 {}
28
29
30
31
32
33
34
35 public static String getConversionFactor(final String conversion)
36 {
37 String text = conversion;
38 if (conversion.indexOf(FormulaParser.VARIABLE) < 0)
39 {
40 text = formatNumber(new BigDecimal(conversion));
41 }
42 return text;
43 }
44
45
46
47
48
49
50
51
52
53
54 public static String getResult(final String input, final String conversionFactor,
55 final BigDecimal molecularWeightCorrection)
56 {
57 BigDecimal resultNumber = BigDecimal.ZERO;
58 String result = null;
59
60 if (conversionFactor != null && verifyInput(input))
61 {
62 if (conversionFactor.indexOf(FormulaParser.VARIABLE) >= 0)
63 {
64 resultNumber = FormulaParser.parse(input, conversionFactor);
65 }
66 else
67 {
68 resultNumber = new BigDecimal(input).multiply(new BigDecimal(conversionFactor));
69 }
70 resultNumber = resultNumber.multiply(molecularWeightCorrection);
71 result = formatNumber(resultNumber);
72 }
73 return result;
74 }
75
76 private static boolean verifyInput(final String input)
77 {
78 boolean matches = false;
79 final String[] patterns = {resources.getString("InputFilter.inputPatternSNDecimal"),
80 resources.getString("InputFilter.inputPatternSNFraction"),
81 resources.getString("InputFilter.inputPatternSNInteger"),
82 resources.getString("InputFilter.inputPatternDecimal"),
83 resources.getString("InputFilter.inputPatternFraction"),
84 resources.getString("InputFilter.inputPatternInteger")};
85
86 for (String pattern : patterns)
87 {
88 if (input.matches(pattern))
89 {
90 matches = true;
91 break;
92 }
93 }
94 return matches;
95 }
96
97 private static String formatNumber(final BigDecimal number)
98 {
99 final int numberLengthLimit = Integer.parseInt(resources.getString("CalculationPanel.numberLengthLimit"));
100 DecimalFormat formatter = new DecimalFormat(resources.getString("CalculationPanel.nonScientificNotationFormat"));
101 if (number.toPlainString().length() > numberLengthLimit)
102 {
103 if (number.doubleValue() < .1 || number.doubleValue() > Math.pow(10, numberLengthLimit))
104 {
105 formatter = new DecimalFormat(resources.getString("CalculationPanel.scientificNotationFormat"));
106 }
107 }
108 final MathContext mathContext = new MathContext(numberLengthLimit, RoundingMode.HALF_UP);
109 final BigDecimal tempFactor = number.round(mathContext);
110 return formatter.format(tempFactor);
111 }
112
113 }