@@ -295,33 +295,15 @@ public ChronoUnit getUnit() {
295
295
}
296
296
}
297
297
298
- /**
299
- * Formats the given estimated temporal amount to a string.
300
- * <p>
301
- * Examples:
302
- * </p>
303
- * <ul>
304
- * <li>Duration of 30 seconds: {@code 30s}</li>
305
- * <li>Duration of 25 hours: {@code 1d1h}</li>
306
- * <li>Duration of 1 year, 2 months, 3 weeks, 4 days, 5 hours, 6 minutes and 7 seconds: {@code 1y2mo3w4d5h6m7s}</li>
307
- * <li>Duration of 1 hours and 61 minutes: {@code 2h1m}</li>
308
- * <li>Past duration of 1 hours and 61 minutes: {@code -2h1m}</li>
309
- * <li>Period of 1 year, 2 months, 4 days: {@code 1y2mo4d}</li>
310
- * <li>Past period of 1 year, 2 months, 4 days: {@code -1y2mo4d}</li>
311
- * </ul>
312
- *
313
- * @param temporalAmount the temporal amount to format. Must not be null.
314
- * @return the formatted string
315
- */
316
- public String format (T temporalAmount ) {
317
- StringBuilder builder = new StringBuilder ();
298
+ public TimeResult prepare (T temporalAmount ) {
299
+ List <TimePart > parts = new ArrayList <>();
318
300
Duration duration = this .toDuration (this .baseForTimeEstimation , temporalAmount );
319
301
for (TimeModifier modifier : this .modifiers ) {
320
302
duration = modifier .modify (duration );
321
303
}
322
304
305
+ boolean isNegative = duration .isNegative ();
323
306
if (duration .isNegative ()) {
324
- builder .append ('-' );
325
307
duration = duration .negated ();
326
308
}
327
309
@@ -345,18 +327,52 @@ public String format(T temporalAmount) {
345
327
346
328
BigInteger nanosCountCleared = count .multiply (nanosInOneUnit );
347
329
348
- builder . append ( count ). append ( key );
330
+ parts . add ( new TimePart ( count , key , unit ) );
349
331
duration = duration .minusNanos (nanosCountCleared .longValue ());
350
332
}
351
333
352
- String result = builder .toString ();
334
+ return new TimeResult (parts , isNegative );
335
+ }
353
336
354
- if (result .isEmpty ()) {
337
+ /**
338
+ * Formats the given estimated temporal amount to a string.
339
+ * <p>
340
+ * Examples:
341
+ * </p>
342
+ * <ul>
343
+ * <li>Duration of 30 seconds: {@code 30s}</li>
344
+ * <li>Duration of 25 hours: {@code 1d1h}</li>
345
+ * <li>Duration of 1 year, 2 months, 3 weeks, 4 days, 5 hours, 6 minutes and 7 seconds: {@code 1y2mo3w4d5h6m7s}</li>
346
+ * <li>Duration of 1 hours and 61 minutes: {@code 2h1m}</li>
347
+ * <li>Past duration of 1 hours and 61 minutes: {@code -2h1m}</li>
348
+ * <li>Period of 1 year, 2 months, 4 days: {@code 1y2mo4d}</li>
349
+ * <li>Past period of 1 year, 2 months, 4 days: {@code -1y2mo4d}</li>
350
+ * </ul>
351
+ *
352
+ * @param temporalAmount the temporal amount to format. Must not be null.
353
+ * @return the formatted string
354
+ */
355
+ public String format (T temporalAmount ) {
356
+ TimeResult result = this .prepare (temporalAmount );
357
+ if (result .parts ().isEmpty ()) {
355
358
String defaultSymbol = this .defaultZeroSymbol .get ();
356
359
return "0" + defaultSymbol ;
357
360
}
358
361
359
- return result ;
362
+ StringBuilder builder = new StringBuilder ();
363
+ if (result .isNegative ()) {
364
+ builder .append ('-' );
365
+ }
366
+
367
+ for (TimePart part : result .parts ()) {
368
+ if (part .count ().equals (BigInteger .ZERO )) {
369
+ continue ;
370
+ }
371
+
372
+ builder .append (part .count ()).append (part .name ());
373
+ }
374
+
375
+ return builder .toString ();
360
376
}
361
377
362
378
protected abstract Duration toDuration (LocalDateTimeProvider baseForTimeEstimation , T temporalAmount );
0 commit comments