package de.szimnau; import de.szimnau.tools.FormatTools; import java.math.BigDecimal; import java.math.MathContext; import java.time.LocalTime; public abstract class AbstractProgressBar extends AbstractLoadingBar { protected static final int LINE_LENGTH = 100; protected static final BigDecimal ONE_HUNDRED_PERCENT = BigDecimal.valueOf(100); protected AbstractProgressBar(LocalTime startTime) { super(startTime); } protected AbstractProgressBar(LocalTime startTime, LocalTime endTime) { super(startTime, endTime); } @Override protected String fillLoadingBar(long passedMinutes, boolean progressive) { var nonNegativePassedMinutes = BigDecimal.valueOf(passedMinutes < 0 ? 0 : passedMinutes); BigDecimal wholePercentage = ONE_HUNDRED_PERCENT // kind of reverse dreisatz to avoid having e.g. 99.9999 instead of 100 % .multiply(nonNegativePassedMinutes) .divide(getTotalMinutesBD(), MathContext.DECIMAL64); int numberOfEquals = wholePercentage.intValue(); var sb = new StringBuilder("["); for (int i = 0; i < LINE_LENGTH; i++) { if (i < numberOfEquals) { sb.append("="); } else { sb.append("-"); } } BigDecimal remainingMinutes = getTotalMinutesBD().subtract(nonNegativePassedMinutes); sb.append("] ").append(FormatTools.PERCENTAGE_FORMAT.format(wholePercentage)).append("% ") .append(FormatTools.minutesToTimeString(nonNegativePassedMinutes)).append(" - ") .append(FormatTools.minutesToTimeString(remainingMinutes)); if (progressive) { sb.append("\r"); } return sb.toString(); } }