mirror of
https://github.com/unicode-org/icu.git
synced 2025-04-07 06:25:30 +00:00
ICU-11293 Added udat_formatCalendar allowing C API user to specify a calendar as a parameter.
X-SVN-Rev: 36777
This commit is contained in:
parent
605d7dd578
commit
281d4de237
3 changed files with 93 additions and 1 deletions
|
@ -237,6 +237,38 @@ udat_format( const UDateFormat* format,
|
|||
return res.extract(result, resultLength, *status);
|
||||
}
|
||||
|
||||
U_CAPI int32_t U_EXPORT2
|
||||
udat_formatCalendar(const UDateFormat* format,
|
||||
UCalendar* calendar,
|
||||
UChar* result,
|
||||
int32_t resultLength,
|
||||
UFieldPosition* position,
|
||||
UErrorCode* status)
|
||||
{
|
||||
if(U_FAILURE(*status)) return -1;
|
||||
|
||||
UnicodeString res;
|
||||
if(!(result==NULL && resultLength==0)) {
|
||||
// NULL destination for pure preflighting: empty dummy string
|
||||
// otherwise, alias the destination buffer
|
||||
res.setTo(result, 0, resultLength);
|
||||
}
|
||||
|
||||
FieldPosition fp;
|
||||
|
||||
if(position != 0)
|
||||
fp.setField(position->field);
|
||||
|
||||
((DateFormat*)format)->format(*(Calendar*)calendar, res, fp);
|
||||
|
||||
if(position != 0) {
|
||||
position->beginIndex = fp.getBeginIndex();
|
||||
position->endIndex = fp.getEndIndex();
|
||||
}
|
||||
|
||||
return res.extract(result, resultLength, *status);
|
||||
}
|
||||
|
||||
U_CAPI UDate U_EXPORT2
|
||||
udat_parse( const UDateFormat* format,
|
||||
const UChar* text,
|
||||
|
|
|
@ -961,6 +961,36 @@ udat_format( const UDateFormat* format,
|
|||
UFieldPosition* position,
|
||||
UErrorCode* status);
|
||||
|
||||
/**
|
||||
* Format a date using an UDateFormat.
|
||||
* The date will be formatted using the conventions specified in {@link #udat_open }
|
||||
* @param format The formatter to use
|
||||
* @param calendar The calendar to format. The calendar instance might be
|
||||
* mutated when fields are not fully calculated yet, although
|
||||
* this function won't change the logical date and time held
|
||||
* by the instance.
|
||||
* @param result A pointer to a buffer to receive the formatted number.
|
||||
* @param capacity The maximum size of result.
|
||||
* @param position A pointer to a UFieldPosition. On input, position->field
|
||||
* is read. On output, position->beginIndex and position->endIndex indicate
|
||||
* the beginning and ending indices of field number position->field, if such
|
||||
* a field exists. This parameter may be NULL, in which case no field
|
||||
* position data is returned.
|
||||
* @param status A pointer to an UErrorCode to receive any errors
|
||||
* @return The total buffer size needed; if greater than resultLength, the output was truncated.
|
||||
* @see udat_format
|
||||
* @see udat_parseCalendar
|
||||
* @see UFieldPosition
|
||||
* @draft ICU 55
|
||||
*/
|
||||
U_DRAFT int32_t U_EXPORT2
|
||||
udat_formatCalendar( const UDateFormat* format,
|
||||
UCalendar* calendar,
|
||||
UChar* result,
|
||||
int32_t capacity,
|
||||
UFieldPosition* position,
|
||||
UErrorCode* status);
|
||||
|
||||
/**
|
||||
* Parse a string into an date/time using a UDateFormat.
|
||||
* The date will be parsed using the conventions specified in {@link #udat_open }.
|
||||
|
|
|
@ -828,6 +828,10 @@ static void TestDateFormatCalendar() {
|
|||
int32_t pos;
|
||||
UDate when;
|
||||
UErrorCode ec = U_ZERO_ERROR;
|
||||
UChar buf1[256];
|
||||
int32_t len1;
|
||||
const char *expected;
|
||||
UChar uExpected[32];
|
||||
|
||||
ctest_setTimeZone(NULL, &ec);
|
||||
|
||||
|
@ -874,6 +878,19 @@ static void TestDateFormatCalendar() {
|
|||
goto FAIL;
|
||||
}
|
||||
|
||||
/* Check if formatCalendar matches the original date */
|
||||
len1 = udat_formatCalendar(date, cal, buf1, UPRV_LENGTHOF(buf1), NULL, &ec);
|
||||
if (U_FAILURE(ec)) {
|
||||
log_err("FAIL: udat_formatCalendar(4/5/2001) failed with %s\n",
|
||||
u_errorName(ec));
|
||||
goto FAIL;
|
||||
}
|
||||
expected = "4/5/01";
|
||||
u_uastrcpy(uExpected, expected);
|
||||
if (u_strlen(uExpected) != len1 || u_strncmp(uExpected, buf1, len1) != 0) {
|
||||
log_err("FAIL: udat_formatCalendar(4/5/2001), expected: %s", expected);
|
||||
}
|
||||
|
||||
/* Parse the time */
|
||||
u_uastrcpy(buf, "5:45 PM");
|
||||
pos = 0;
|
||||
|
@ -883,7 +900,20 @@ static void TestDateFormatCalendar() {
|
|||
pos, u_errorName(ec));
|
||||
goto FAIL;
|
||||
}
|
||||
|
||||
|
||||
/* Check if formatCalendar matches the original time */
|
||||
len1 = udat_formatCalendar(time, cal, buf1, UPRV_LENGTHOF(buf1), NULL, &ec);
|
||||
if (U_FAILURE(ec)) {
|
||||
log_err("FAIL: udat_formatCalendar(17:45) failed with %s\n",
|
||||
u_errorName(ec));
|
||||
goto FAIL;
|
||||
}
|
||||
expected = "5:45 PM";
|
||||
u_uastrcpy(uExpected, expected);
|
||||
if (u_strlen(uExpected) != len1 || u_strncmp(uExpected, buf1, len1) != 0) {
|
||||
log_err("FAIL: udat_formatCalendar(17:45), expected: %s", expected);
|
||||
}
|
||||
|
||||
/* Check result */
|
||||
when = ucal_getMillis(cal, &ec);
|
||||
if (U_FAILURE(ec)) {
|
||||
|
|
Loading…
Add table
Reference in a new issue