Skip to content

Commit 173e9b2

Browse files
committed
#152: Extract additional methods.
1 parent 6d3adc1 commit 173e9b2

File tree

4 files changed

+81
-117
lines changed

4 files changed

+81
-117
lines changed

jpx/src/main/java/io/jenetics/jpx/format/Elevation.java

+1-15
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
import static io.jenetics.jpx.Length.Unit.METER;
1919

20-
import java.text.DecimalFormat;
2120
import java.text.ParsePosition;
2221
import java.util.Optional;
2322

@@ -29,23 +28,10 @@
2928
*/
3029
final class Elevation extends Field {
3130

32-
private boolean _prefixSign = false;
33-
3431
Elevation(final String pattern) {
3532
super(pattern);
3633
}
3734

38-
@Override
39-
void setPrefixSign(final boolean b) {
40-
_prefixSign = b;
41-
final var decimalPattern = toDecimalPattern(_pattern);
42-
final var pattern = b
43-
? ("+" + decimalPattern + ";" + "-" + decimalPattern)
44-
: decimalPattern;
45-
46-
setFormat(new DecimalFormat(pattern, SYMBOLS));
47-
}
48-
4935
@Override
5036
char type() {
5137
return 'E';
@@ -69,7 +55,7 @@ public Optional<String> format(final Location loc) {
6955

7056
@Override
7157
public String toPattern() {
72-
return _prefixSign ? "+" + _pattern : _pattern;
58+
return isPrefixSign() ? "+" + super.toPattern() : super.toPattern();
7359
}
7460

7561
}

jpx/src/main/java/io/jenetics/jpx/format/Field.java

+76-56
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import static java.math.RoundingMode.HALF_EVEN;
2222
import static java.util.Objects.requireNonNull;
2323

24-
import java.math.RoundingMode;
2524
import java.text.DecimalFormat;
2625
import java.text.DecimalFormatSymbols;
2726
import java.text.NumberFormat;
@@ -40,10 +39,12 @@
4039
*/
4140
abstract class Field implements Format {
4241

43-
static final DecimalFormatSymbols SYMBOLS =
42+
private static final DecimalFormatSymbols SYMBOLS =
4443
DecimalFormatSymbols.getInstance(Locale.US);
4544

46-
final String _pattern;
45+
private final String _pattern;
46+
private boolean _prefixSign = false;
47+
private boolean _absolute = false;
4748

4849
private final AtomicReference<NumberFormat> _format = new AtomicReference<>();
4950

@@ -52,72 +53,50 @@ abstract class Field implements Format {
5253
_format.set(new DecimalFormat(toDecimalPattern(pattern), SYMBOLS));
5354
}
5455

56+
private String toDecimalPattern(final String pattern) {
57+
return pattern.replace(type(), '0');
58+
}
59+
5560
/**
5661
* Return the type character of this field.
5762
*
5863
* @return the type character of this field
5964
*/
6065
abstract char type();
6166

62-
void setPrefixSign(final boolean b) {
63-
}
67+
final void setPrefixSign(final boolean b) {
68+
_prefixSign = b;
6469

65-
void setTruncate(final boolean b) {
66-
_format.get().setRoundingMode(b ? DOWN : HALF_EVEN);
67-
}
70+
final String decimalPattern = toDecimalPattern(_pattern);
71+
final String pattern = _prefixSign
72+
? "+%1$s;-%1$s".formatted(decimalPattern)
73+
: decimalPattern;
6874

69-
void setFormat(final NumberFormat format) {
70-
_format.set(requireNonNull(format));
75+
setFormat(new DecimalFormat(pattern, SYMBOLS));
7176
}
7277

73-
int getMinimumFractionDigits() {
74-
return _format.get().getMinimumFractionDigits();
78+
final boolean isPrefixSign() {
79+
return _prefixSign;
7580
}
7681

77-
static double toMinutes(final double degrees) {
78-
double dd = abs(degrees);
79-
return (dd - floor(dd)) * 60.0;
82+
final void setAbsolute(final boolean b) {
83+
_absolute = b;
8084
}
8185

82-
static double toSeconds(final double degrees) {
83-
double dd = abs(degrees);
84-
double d = floor(dd);
85-
double m = floor((dd - d) * 60.0);
86-
return (dd - d - m / 60.0) * 3600.0;
86+
final boolean isAbsolute() {
87+
return _absolute;
8788
}
8889

89-
static Optional<Field> ofPattern(final String pattern) {
90-
// TODO better?
91-
for (int i = 0; i < pattern.length(); ++i) {
92-
char c = pattern.charAt(i);
93-
switch (c){
94-
case 'L': {
95-
String p = pattern.replace('L', 'D');
96-
return Optional.of(new LatitudeDegree(p));
97-
}
98-
case 'D': return Optional.of(new LatitudeDegree(pattern));
99-
case 'M': return Optional.of(new LatitudeMinute(pattern));
100-
case 'S': return Optional.of(new LatitudeSecond(pattern));
101-
case 'l': {
102-
String p = pattern.replace('l','d');
103-
return Optional.of(new LongitudeDegree(p));
104-
}
105-
case 'd': return Optional.of(new LongitudeDegree(pattern));
106-
case 'm': return Optional.of(new LongitudeMinute(pattern));
107-
case 's': return Optional.of(new LongitudeSecond(pattern));
108-
case 'E': return Optional.of(new Elevation(pattern));
109-
case 'H': {
110-
String p = pattern.replace('H', 'E');
111-
return Optional.of(new Elevation(p));
112-
}
113-
}
114-
}
90+
final void setTruncate(final boolean b) {
91+
_format.get().setRoundingMode(b ? DOWN : HALF_EVEN);
92+
}
11593

116-
return Optional.empty();
94+
final void setFormat(final NumberFormat format) {
95+
_format.set(requireNonNull(format));
11796
}
11897

119-
String toDecimalPattern(final String pattern) {
120-
return pattern.replace(type(), '0');
98+
final int getMinimumFractionDigits() {
99+
return _format.get().getMinimumFractionDigits();
121100
}
122101

123102
@Override
@@ -131,7 +110,7 @@ public String toPattern() {
131110
* @param value the double value to format
132111
* @return the formatted double value
133112
*/
134-
String format(final double value) {
113+
final String format(final double value) {
135114
return _format.get().format(value);
136115
}
137116

@@ -142,17 +121,16 @@ String format(final double value) {
142121
* @param pos the parse position
143122
* @return the parsed double value
144123
*/
145-
double parse(final CharSequence in, final ParsePosition pos) {
124+
final double parse(final CharSequence in, final ParsePosition pos) {
146125
int i = pos.getIndex();
147126
String s = in.toString();
148-
boolean strictWidth = 1 < _format.get().getMinimumIntegerDigits(); //better?
127+
boolean strictWidth = 1 < _format.get().getMinimumIntegerDigits();
149128
if (strictWidth) {
150-
int end = i + toPattern().length(); // toPattern() rather than pattern because LatitudeDegree.toPattern()
151-
s = in.subSequence(0, end).toString(); // don't eat more digits
129+
int end = i + toPattern().length();
130+
s = in.subSequence(0, end).toString();
152131
}
153132

154-
final Number n;
155-
synchronized (_format) {
133+
final Number n; synchronized (_format) {
156134
n = _format.get().parse(s, pos);
157135
}
158136

@@ -164,4 +142,46 @@ String format(final double value) {
164142
return n.doubleValue();
165143
}
166144

145+
146+
static double toMinutes(final double degrees) {
147+
final double dd = abs(degrees);
148+
return (dd - floor(dd)) * 60.0;
149+
}
150+
151+
static double toSeconds(final double degrees) {
152+
final double dd = abs(degrees);
153+
final double d = floor(dd);
154+
final double m = floor((dd - d) * 60.0);
155+
return (dd - d - m / 60.0) * 3600.0;
156+
}
157+
158+
static Optional<Field> ofPattern(final String pattern) {
159+
// TODO better?
160+
for (int i = 0; i < pattern.length(); ++i) {
161+
switch (pattern.charAt(i)) {
162+
case 'L': {
163+
final String p = pattern.replace('L', 'D');
164+
return Optional.of(new LatitudeDegree(p));
165+
}
166+
case 'D': return Optional.of(new LatitudeDegree(pattern));
167+
case 'M': return Optional.of(new LatitudeMinute(pattern));
168+
case 'S': return Optional.of(new LatitudeSecond(pattern));
169+
case 'l': {
170+
final String p = pattern.replace('l','d');
171+
return Optional.of(new LongitudeDegree(p));
172+
}
173+
case 'd': return Optional.of(new LongitudeDegree(pattern));
174+
case 'm': return Optional.of(new LongitudeMinute(pattern));
175+
case 's': return Optional.of(new LongitudeSecond(pattern));
176+
case 'E': return Optional.of(new Elevation(pattern));
177+
case 'H': {
178+
final String p = pattern.replace('H', 'E');
179+
return Optional.of(new Elevation(p));
180+
}
181+
}
182+
}
183+
184+
return Optional.empty();
185+
}
186+
167187
}

jpx/src/main/java/io/jenetics/jpx/format/LatitudeDegree.java

+2-22
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
import static java.lang.Math.abs;
1919

20-
import java.text.DecimalFormat;
2120
import java.text.ParsePosition;
2221
import java.util.Optional;
2322

@@ -35,29 +34,10 @@
3534
*/
3635
final class LatitudeDegree extends Field {
3736

38-
private boolean _prefixSign = false;
39-
4037
LatitudeDegree(final String pattern) {
4138
super(pattern);
4239
}
4340

44-
void setPrefixSign(boolean b) {
45-
_prefixSign = b;
46-
String decimalPattern = toDecimalPattern(_pattern);
47-
String p = b ? ("+" + decimalPattern + ";" + "-" + decimalPattern) : decimalPattern;
48-
setFormat(new DecimalFormat(p, SYMBOLS));
49-
}
50-
51-
boolean isPrefixSign() {
52-
return _prefixSign;
53-
}
54-
55-
private boolean absolute = false;
56-
57-
void setAbsolute(final boolean b) {
58-
absolute = b;
59-
}
60-
6141
@Override
6242
char type() {
6343
return 'D';
@@ -77,13 +57,13 @@ public void parse(
7757
public Optional<String> format(final Location loc) {
7858
return loc.latitude()
7959
.map(Latitude::toDegrees)
80-
.map(d -> absolute ? abs(d) : d)
60+
.map(d -> isAbsolute() ? abs(d) : d)
8161
.map(this::format);
8262
}
8363

8464
@Override
8565
public String toPattern() {
86-
return _prefixSign ? "+" + _pattern : _pattern;
66+
return isPrefixSign() ? "+" + super.toPattern() : super.toPattern();
8767
}
8868

8969
}

jpx/src/main/java/io/jenetics/jpx/format/LongitudeDegree.java

+2-24
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
import static java.lang.Math.abs;
1919

20-
import java.text.DecimalFormat;
2120
import java.text.ParsePosition;
2221
import java.util.Optional;
2322

@@ -35,31 +34,10 @@
3534
*/
3635
class LongitudeDegree extends Field {
3736

38-
private boolean prefixSign = false;
39-
private boolean absolute = false;
40-
4137
LongitudeDegree(final String pattern) {
4238
super(pattern);
4339
}
4440

45-
void setPrefixSign(final boolean b) {
46-
prefixSign = b;
47-
final String decimalPattern = toDecimalPattern(_pattern);
48-
final String pattern = prefixSign
49-
? ("+" + decimalPattern + ";" + "-" + decimalPattern)
50-
: decimalPattern;
51-
52-
setFormat(new DecimalFormat(pattern, SYMBOLS));
53-
}
54-
55-
boolean isPrefixSign() {
56-
return prefixSign;
57-
}
58-
59-
void setAbsolute(final boolean b) {
60-
absolute = b;
61-
}
62-
6341
@Override
6442
char type() {
6543
return 'd';
@@ -79,13 +57,13 @@ public void parse(
7957
public Optional<String> format(final Location loc) {
8058
return loc.longitude()
8159
.map(Longitude::toDegrees)
82-
.map(d -> absolute ? abs(d) : d)
60+
.map(d -> isAbsolute() ? abs(d) : d)
8361
.map(this::format);
8462
}
8563

8664
@Override
8765
public String toPattern() {
88-
return prefixSign ? "+" + _pattern : _pattern;
66+
return isPrefixSign() ? "+" + super.toPattern() : super.toPattern();
8967
}
9068

9169
}

0 commit comments

Comments
 (0)