// Formats hours-minutes-seconds as 5:37:23 or similar. UnicodeString &MeasureFormat::formatNumeric( const Formattable *hms, // always length 3 int32_t bitMap, // 1=hourset, 2=minuteset, 4=secondset UnicodeString &appendTo, UErrorCode &status) const { if (U_FAILURE(status)) { return appendTo; } UDate millis = (UDate) (((uprv_trunc(hms[0].getDouble(status)) * 60.0 + uprv_trunc(hms[1].getDouble(status))) * 60.0 + uprv_trunc(hms[2].getDouble(status))) * 1000.0); switch (bitMap) { case 5: // hs case 7: // hms return formatNumeric( millis, cache->getNumericDateFormatters()->hourMinuteSecond, UDAT_SECOND_FIELD, hms[2], appendTo, status); break; case 6: // ms return formatNumeric( millis, cache->getNumericDateFormatters()->minuteSecond, UDAT_SECOND_FIELD, hms[2], appendTo, status); break; case 3: // hm return formatNumeric( millis, cache->getNumericDateFormatters()->hourMinute, UDAT_MINUTE_FIELD, hms[1], appendTo, status); break; default: status = U_INTERNAL_PROGRAM_ERROR; return appendTo; break; } return appendTo; }
UnicodeString &MeasureFormat::formatMeasures( const Measure *measures, int32_t measureCount, UnicodeString &appendTo, FieldPosition &pos, UErrorCode &status) const { if (U_FAILURE(status)) { return appendTo; } if (measureCount == 0) { return appendTo; } if (measureCount == 1) { return formatMeasure(measures[0], **numberFormat, appendTo, pos, status); } if (fWidth == UMEASFMT_WIDTH_NUMERIC) { Formattable hms[3]; int32_t bitMap = toHMS(measures, measureCount, hms, status); if (bitMap > 0) { return formatNumeric(hms, bitMap, appendTo, status); } } if (pos.getField() != FieldPosition::DONT_CARE) { return formatMeasuresSlowTrack( measures, measureCount, appendTo, pos, status); } UnicodeString *results = new UnicodeString[measureCount]; if (results == NULL) { status = U_MEMORY_ALLOCATION_ERROR; return appendTo; } for (int32_t i = 0; i < measureCount; ++i) { const NumberFormat *nf = cache->getIntegerFormat(); if (i == measureCount - 1) { nf = numberFormat->get(); } formatMeasure( measures[i], *nf, results[i], pos, status); } listFormatter->format(results, measureCount, appendTo, status); delete [] results; return appendTo; }