1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package com.irurueta.units;
17
18 import java.text.ParseException;
19 import java.util.Locale;
20
21
22
23
24 public class SurfaceFormatter extends MeasureFormatter<Surface, SurfaceUnit> {
25
26
27
28 public static final String SQUARE_MILLIMETER = "mm²";
29
30
31
32
33 public static final String SQUARE_CENTIMETER = "cm²";
34
35
36
37
38 public static final String SQUARE_METER = "m²";
39
40
41
42
43 public static final String SQUARE_KILOMETER = "Km²";
44
45
46
47
48 public static final String SQUARE_INCH = "sq in";
49
50
51
52
53 public static final String SQUARE_FOOT = "sq ft";
54
55
56
57
58 public static final String SQUARE_YARD = "sq yd";
59
60
61
62
63 public static final String SQUARE_MILE = "sq mi";
64
65
66
67
68 public static final String CENTIARE = "ca";
69
70
71
72
73 public static final String ARE = "a";
74
75
76
77
78 public static final String DECARE = "daa";
79
80
81
82
83 public static final String HECTARE = "ha";
84
85
86
87
88 public static final String ACRE = "acre";
89
90
91
92
93 @SuppressWarnings("WeakerAccess")
94 public SurfaceFormatter() {
95 super();
96 }
97
98
99
100
101
102
103
104 @SuppressWarnings("WeakerAccess")
105 public SurfaceFormatter(final Locale locale) {
106 super(locale);
107 }
108
109
110
111
112
113
114
115 public SurfaceFormatter(final SurfaceFormatter formatter) {
116 this(formatter.getLocale());
117 }
118
119
120
121
122
123
124
125
126 @Override
127 public boolean equals(final Object obj) {
128 final var equals = super.equals(obj);
129 return (obj instanceof SurfaceFormatter) && equals;
130 }
131
132
133
134
135
136
137
138
139 @Override
140 public int hashCode() {
141 return super.hashCode();
142 }
143
144
145
146
147
148
149
150
151
152 @Override
153 public UnitSystem getUnitSystem(final String source) {
154 final var unit = findUnit(source);
155 return unit != null ? SurfaceUnit.getUnitSystem(unit) : null;
156 }
157
158
159
160
161
162
163
164
165
166 @Override
167 public Surface parse(final String source) throws ParseException, UnknownUnitException {
168 return internalParse(source, new Surface());
169 }
170
171
172
173
174
175
176
177
178 @Override
179 public SurfaceUnit findUnit(final String source) {
180 if (source.contains(SQUARE_MILLIMETER + " ") || source.endsWith(SQUARE_MILLIMETER)) {
181 return SurfaceUnit.SQUARE_MILLIMETER;
182 }
183 if (source.contains(SQUARE_CENTIMETER + " ") || source.endsWith(SQUARE_CENTIMETER)) {
184 return SurfaceUnit.SQUARE_CENTIMETER;
185 }
186 if (source.contains(SQUARE_KILOMETER + " ") || source.endsWith(SQUARE_KILOMETER)) {
187 return SurfaceUnit.SQUARE_KILOMETER;
188 }
189 if (source.contains(SQUARE_INCH + " ") || source.endsWith(SQUARE_INCH)) {
190 return SurfaceUnit.SQUARE_INCH;
191 }
192 if (source.contains(SQUARE_FOOT + " ") || source.endsWith(SQUARE_FOOT)) {
193 return SurfaceUnit.SQUARE_FOOT;
194 }
195 if (source.contains(SQUARE_YARD + " ") || source.endsWith(SQUARE_YARD)) {
196 return SurfaceUnit.SQUARE_YARD;
197 }
198 if (source.contains(SQUARE_MILE + " ") || source.endsWith(SQUARE_MILE)) {
199 return SurfaceUnit.SQUARE_MILE;
200 }
201 if (source.contains(CENTIARE + " ") || source.endsWith(CENTIARE)) {
202 return SurfaceUnit.CENTIARE;
203 }
204 if (source.contains(DECARE + " ") || source.endsWith(DECARE)) {
205 return SurfaceUnit.DECARE;
206 }
207 if (source.contains(HECTARE + " ") || source.endsWith(HECTARE)) {
208 return SurfaceUnit.HECTARE;
209 }
210 if (source.contains(ACRE + " ") || source.endsWith(ACRE)) {
211 return SurfaceUnit.ACRE;
212 }
213
214 if (source.contains(ARE + " ") || source.endsWith(ARE)) {
215 return SurfaceUnit.ARE;
216 }
217 if (source.contains(SQUARE_METER + " ") || source.endsWith(SQUARE_METER)) {
218 return SurfaceUnit.SQUARE_METER;
219 }
220 return null;
221 }
222
223
224
225
226
227
228
229
230
231
232
233
234
235 @Override
236 public String formatAndConvert(final Number value, final SurfaceUnit unit, final UnitSystem system) {
237 if (system == UnitSystem.IMPERIAL) {
238 return formatAndConvertImperial(value, unit);
239 } else {
240 return formatAndConvertMetric(value, unit);
241 }
242 }
243
244
245
246
247
248
249
250
251
252
253
254
255 public String formatAndConvertMetric(final Number value, final SurfaceUnit unit) {
256 final var v = value.doubleValue();
257
258 final var squareMillimeters = SurfaceConverter.convert(v, unit, SurfaceUnit.SQUARE_MILLIMETER);
259 if (Math.abs(squareMillimeters) < (SurfaceConverter.SQUARE_METERS_PER_SQUARE_CENTIMETER
260 / SurfaceConverter.SQUARE_METERS_PER_SQUARE_MILLIMETER)) {
261 return format(squareMillimeters, SurfaceUnit.SQUARE_MILLIMETER);
262 }
263
264 final var squareCentimeters = SurfaceConverter.convert(v, unit, SurfaceUnit.SQUARE_CENTIMETER);
265 if (Math.abs(squareCentimeters) < (1.0 / SurfaceConverter.SQUARE_METERS_PER_SQUARE_CENTIMETER)) {
266 return format(squareCentimeters, SurfaceUnit.SQUARE_CENTIMETER);
267 }
268
269 final var squareMeters = SurfaceConverter.convert(v, unit, SurfaceUnit.SQUARE_METER);
270 if (Math.abs(squareMeters) < SurfaceConverter.SQUARE_METERS_PER_SQUARE_KILOMETER) {
271 return format(squareMeters, SurfaceUnit.SQUARE_METER);
272 }
273
274 final var squareKilometers = SurfaceConverter.convert(v, unit, SurfaceUnit.SQUARE_KILOMETER);
275 return format(squareKilometers, SurfaceUnit.SQUARE_KILOMETER);
276 }
277
278
279
280
281
282
283
284
285
286
287
288
289 public String formatAndConvertImperial(final Number value, final SurfaceUnit unit) {
290 final var v = value.doubleValue();
291
292 final var squareInches = SurfaceConverter.convert(v, unit, SurfaceUnit.SQUARE_INCH);
293 if (Math.abs(squareInches) < (SurfaceConverter.SQUARE_METERS_PER_SQUARE_FOOT
294 / SurfaceConverter.SQUARE_METERS_PER_SQUARE_INCH)) {
295 return format(squareInches, SurfaceUnit.SQUARE_INCH);
296 }
297
298 final var squareFeet = SurfaceConverter.convert(v, unit, SurfaceUnit.SQUARE_FOOT);
299 if (Math.abs(squareFeet) < (SurfaceConverter.SQUARE_METERS_PER_SQUARE_YARD
300 / SurfaceConverter.SQUARE_METERS_PER_SQUARE_FOOT)) {
301 return format(squareFeet, SurfaceUnit.SQUARE_FOOT);
302 }
303
304 final var squareYards = SurfaceConverter.convert(v, unit, SurfaceUnit.SQUARE_YARD);
305 if (Math.abs(squareYards) < (SurfaceConverter.SQUARE_METERS_PER_SQUARE_MILE
306 / SurfaceConverter.SQUARE_METERS_PER_SQUARE_YARD)) {
307 return format(squareYards, SurfaceUnit.SQUARE_YARD);
308 }
309
310 final var squareMiles = SurfaceConverter.convert(v, unit, SurfaceUnit.SQUARE_MILE);
311 return format(squareMiles, SurfaceUnit.SQUARE_MILE);
312 }
313
314
315
316
317
318
319
320 @Override
321 public String getUnitSymbol(final SurfaceUnit unit) {
322 return switch (unit) {
323 case SQUARE_MILLIMETER -> SQUARE_MILLIMETER;
324 case SQUARE_CENTIMETER -> SQUARE_CENTIMETER;
325 case SQUARE_KILOMETER -> SQUARE_KILOMETER;
326 case SQUARE_INCH -> SQUARE_INCH;
327 case SQUARE_FOOT -> SQUARE_FOOT;
328 case SQUARE_YARD -> SQUARE_YARD;
329 case SQUARE_MILE -> SQUARE_MILE;
330 case CENTIARE -> CENTIARE;
331 case ARE -> ARE;
332 case DECARE -> DECARE;
333 case HECTARE -> HECTARE;
334 case ACRE -> ACRE;
335 default -> SQUARE_METER;
336 };
337 }
338 }