1 /* 2 * Copyright 2010, Haiku, Inc. All Rights Reserved. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Adrien Destugues <pulkomandy@gmail.com> 7 * Oliver Tappe <zooey@hirschkaefer.de> 8 */ 9 10 11 #include <TimeUnitFormat.h> 12 13 #include <new> 14 15 #include <unicode/format.h> 16 #include <unicode/tmutfmt.h> 17 #include <unicode/utypes.h> 18 #include <ICUWrapper.h> 19 20 21 // maps our unit element to the corresponding ICU unit 22 static const TimeUnit::UTimeUnitFields skUnitMap[] = { 23 TimeUnit::UTIMEUNIT_YEAR, 24 TimeUnit::UTIMEUNIT_MONTH, 25 TimeUnit::UTIMEUNIT_WEEK, 26 TimeUnit::UTIMEUNIT_DAY, 27 TimeUnit::UTIMEUNIT_HOUR, 28 TimeUnit::UTIMEUNIT_MINUTE, 29 TimeUnit::UTIMEUNIT_SECOND, 30 }; 31 32 33 status_t BTimeUnitFormat::Format(int32 value, time_unit_element unit, 34 BString* buffer, time_unit_style style) const 35 { 36 if (buffer == NULL || unit < 0 || unit > B_TIME_UNIT_LAST 37 || (style != B_TIME_UNIT_ABBREVIATED && style != B_TIME_UNIT_FULL)) 38 return B_BAD_VALUE; 39 40 UErrorCode icuStatus = U_ZERO_ERROR; 41 TimeUnitFormat timeUnitFormatter(icuStatus); 42 43 if (!U_SUCCESS(icuStatus)) 44 return B_ERROR; 45 46 TimeUnitAmount* timeUnitAmount 47 = new TimeUnitAmount((double)value, skUnitMap[unit], icuStatus); 48 if (timeUnitAmount == NULL) 49 return B_NO_MEMORY; 50 if (!U_SUCCESS(icuStatus)) 51 return B_ERROR; 52 53 Formattable formattable; 54 formattable.adoptObject(timeUnitAmount); 55 FieldPosition pos(FieldPosition::DONT_CARE); 56 UnicodeString unicodeResult; 57 timeUnitFormatter.format(formattable, unicodeResult, pos, icuStatus); 58 if (!U_SUCCESS(icuStatus)) 59 return B_ERROR; 60 61 BStringByteSink byteSink(buffer); 62 unicodeResult.toUTF8(byteSink); 63 64 return B_OK; 65 } 66