Numeric.java
4.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*
* Decompiled with CFR 0_118.
*/
package com.adobe.xfa.ut;
import java.math.BigDecimal;
import java.text.NumberFormat;
import java.text.ParsePosition;
import java.util.Locale;
public final class Numeric {
private static final int MAX_PRECISION = 15;
private static final NumberFormat format = NumberFormat.getNumberInstance(Locale.US);
private Numeric() {
}
public static String doubleToStringUsingBigDecimal(double dValue, int fracDigits, boolean bTruncate) {
if (Double.isNaN(dValue) || Double.isInfinite(dValue)) {
return "";
}
if (fracDigits >= 0) {
int checkDigit;
double fraction;
if (fracDigits > 15) {
fracDigits = 15;
}
if ((checkDigit = (int)((fraction = dValue - (double)((int)dValue)) * Math.pow(10.0, fracDigits + 1)) - (int)(fraction * Math.pow(10.0, fracDigits)) * 10) == 5) {
dValue += Math.pow(0.1, fracDigits + 1);
}
double p = Math.pow(10.0, fracDigits);
String conversionString = "%#." + fracDigits + "f";
if (fracDigits == 0) {
conversionString = "%.0f";
}
String sValue = String.format(conversionString, new BigDecimal(dValue));
if (!bTruncate) {
return sValue;
}
if (sValue.charAt(sValue.length() - 1) != '0') {
return sValue;
}
int endIndex = sValue.length() - 1;
while (sValue.charAt(endIndex) == '0') {
--endIndex;
}
if (sValue.charAt(endIndex) == '.') {
--endIndex;
}
return sValue.substring(0, endIndex + 1);
}
String sValue = Numeric.getNumberFormat(fracDigits).format(dValue);
return sValue;
}
public static String doubleToString(double dValue, int fracDigits, boolean bTruncate) {
if (Double.isNaN(dValue) || Double.isInfinite(dValue)) {
return "";
}
if (fracDigits >= 0) {
int checkDigit;
double fraction;
if (fracDigits > 15) {
fracDigits = 15;
}
if ((checkDigit = (int)((fraction = dValue - (double)((int)dValue)) * Math.pow(10.0, fracDigits + 1)) - (int)(fraction * Math.pow(10.0, fracDigits)) * 10) == 5) {
dValue += Math.pow(0.1, fracDigits + 1);
}
double p = Math.pow(10.0, fracDigits);
String conversionString = "%#." + fracDigits + "f";
if (fracDigits == 0) {
conversionString = "%.0f";
}
String sValue = String.format(conversionString, dValue);
if (!bTruncate) {
return sValue;
}
if (sValue.charAt(sValue.length() - 1) != '0') {
return sValue;
}
int endIndex = sValue.length() - 1;
while (sValue.charAt(endIndex) == '0') {
--endIndex;
}
if (sValue.charAt(endIndex) == '.') {
--endIndex;
}
return sValue.substring(0, endIndex + 1);
}
String sValue = Numeric.getNumberFormat(fracDigits).format(dValue);
return sValue;
}
public static double stringToDouble(String str, boolean bAllowNaN) {
if ((str = str.trim()).length() == 0) {
return bAllowNaN ? Double.NaN : 0.0;
}
ParsePosition pp = new ParsePosition(0);
Number n = Numeric.getNumberFormat(1).parse(str, pp);
if (n == null || pp.getErrorIndex() != -1 || pp.getIndex() < str.length()) {
return bAllowNaN ? Double.NaN : 0.0;
}
double d = n.doubleValue();
if (Double.isNaN(d) || Double.isInfinite(d)) {
return bAllowNaN ? Double.NaN : 0.0;
}
return d;
}
private static NumberFormat getNumberFormat(int fracDigits) {
NumberFormat customFormat = (NumberFormat)format.clone();
customFormat.setMinimumFractionDigits(fracDigits);
customFormat.setMaximumFractionDigits(fracDigits);
return customFormat;
}
static {
format.setGroupingUsed(false);
format.setMinimumIntegerDigits(1);
format.setMaximumIntegerDigits(310);
}
}