static String format()

in src/main/java/org/apache/commons/lang3/time/DurationFormatUtils.java [239:328]


    static String format(final Token[] tokens, final long years, final long months, final long days, final long hours, final long minutes,
            final long seconds,
            final long milliseconds, final boolean padWithZeros) {
        final StringBuilder buffer = new StringBuilder();
        boolean lastOutputSeconds = false;
        boolean lastOutputZero = false;
        int optionalStart = -1;
        boolean firstOptionalNonLiteral = false;
        int optionalIndex = -1;
        boolean inOptional = false;
        for (final Token token : tokens) {
            final Object value = token.getValue();
            final boolean isLiteral = value instanceof StringBuilder;
            final int count = token.getCount();
            if (optionalIndex != token.optionalIndex) {
              optionalIndex = token.optionalIndex;
              if (optionalIndex > -1) {
                //entering new optional block
                optionalStart = buffer.length();
                lastOutputZero = false;
                inOptional = true;
                firstOptionalNonLiteral = false;
              } else {
                //leaving optional block
                inOptional = false;
              }
            }
            if (isLiteral) {
                if (!inOptional || !lastOutputZero) {
                    buffer.append(value.toString());
                }
            } else if (value.equals(y)) {
                lastOutputSeconds = false;
                lastOutputZero = years == 0;
                if (!inOptional || !lastOutputZero) {
                    buffer.append(paddedValue(years, padWithZeros, count));
                }
            } else if (value.equals(M)) {
                lastOutputSeconds = false;
                lastOutputZero = months == 0;
                if (!inOptional || !lastOutputZero) {
                    buffer.append(paddedValue(months, padWithZeros, count));
                }
            } else if (value.equals(d)) {
                lastOutputSeconds = false;
                lastOutputZero = days == 0;
                if (!inOptional || !lastOutputZero) {
                    buffer.append(paddedValue(days, padWithZeros, count));
                }
            } else if (value.equals(H)) {
                lastOutputSeconds = false;
                lastOutputZero = hours == 0;
                if (!inOptional || !lastOutputZero) {
                    buffer.append(paddedValue(hours, padWithZeros, count));
                }
            } else if (value.equals(m)) {
                lastOutputSeconds = false;
                lastOutputZero = minutes == 0;
                if (!inOptional || !lastOutputZero) {
                    buffer.append(paddedValue(minutes, padWithZeros, count));
                }
            } else if (value.equals(s)) {
                lastOutputSeconds = true;
                lastOutputZero = seconds == 0;
                if (!inOptional || !lastOutputZero) {
                    buffer.append(paddedValue(seconds, padWithZeros, count));
                }
            } else if (value.equals(S)) {
                lastOutputZero = milliseconds == 0;
                if (!inOptional || !lastOutputZero) {
                    if (lastOutputSeconds) {
                        // ensure at least 3 digits are displayed even if padding is not selected
                        final int width = padWithZeros ? Math.max(3, count) : 3;
                        buffer.append(paddedValue(milliseconds, true, width));
                    } else {
                        buffer.append(paddedValue(milliseconds, padWithZeros, count));
                    }
                }
                lastOutputSeconds = false;
            }
            //as soon as we hit first nonliteral in optional, check for literal prefix
            if (inOptional && !isLiteral && !firstOptionalNonLiteral) {
                firstOptionalNonLiteral = true;
                if (lastOutputZero) {
                    buffer.delete(optionalStart, buffer.length());
                }
            }
        }
        return buffer.toString();
    }