diff --git a/icu4j/src/com/ibm/icu/dev/test/duration/ICUDurationTest.java b/icu4j/src/com/ibm/icu/dev/test/duration/ICUDurationTest.java index 33d1cfb154d..3c48d4a8cba 100644 --- a/icu4j/src/com/ibm/icu/dev/test/duration/ICUDurationTest.java +++ b/icu4j/src/com/ibm/icu/dev/test/duration/ICUDurationTest.java @@ -8,6 +8,12 @@ package com.ibm.icu.dev.test.duration; import java.util.Date; +// BEGIN JDK>1.5 +import javax.xml.datatype.DatatypeConfigurationException; +import javax.xml.datatype.DatatypeFactory; +import javax.xml.datatype.Duration; +// END JDK>1.5 + import com.ibm.icu.dev.test.TestFmwk; import com.ibm.icu.text.DurationFormat; import com.ibm.icu.util.ULocale; @@ -72,7 +78,91 @@ public class ICUDurationTest extends TestFmwk { } else { logln("format long obj -> " + formatted); } - - } + + // BEGIN JDK>1.5 + + public void TestSimpleXMLDuration() { + DatatypeFactory factory = null; + try { + factory = DatatypeFactory.newInstance(); + } catch (DatatypeConfigurationException e) { + errln("Error instantiating XML DatatypeFactory."); + e.printStackTrace(); + } + + Duration d; + DurationFormat df; + String out; + String expected; + + + // test 1 + d = factory.newDuration("PT2H46M40S"); + df = DurationFormat.getInstance(new ULocale("en")); + expected = "2 hours, 46 minutes, and 40 seconds"; + out = df.format(d); + if(out.equals(expected)) { + logln("out=expected: " + expected + " from " + d); + } else { + errln("FAIL: got " + out + " wanted " + expected + " from " + d); + } + + // test 2 + d = factory.newDuration(10000); + df = DurationFormat.getInstance(new ULocale("en")); + expected = "10 seconds"; + out = df.format(d); + if(out.equals(expected)) { + logln("out=expected: " + expected + " from " + d); + } else { + errln("FAIL: got " + out + " wanted " + expected + " from " + d); + } + } + + + public void TestXMLDuration() { + DatatypeFactory factory = null; + try { + factory = DatatypeFactory.newInstance(); + } catch (DatatypeConfigurationException e) { + errln("Error instantiating XML DatatypeFactory."); + e.printStackTrace(); + } + + String cases[] = { + "en", "PT10.00099S", "10 seconds", + "en", "#10000", "10 seconds", + "en", "-PT10.00099S", "10 seconds", + "en", "#-10000", "10 seconds", + + // from BD req's + "en", "PT2H46M40S", "2 hours, 46 minutes, and 40 seconds", + "it", "PT2H46M40S", "due ore, 46 minuti e 40 secondi", + }; + + for(int n=0;n1.5 } diff --git a/icu4j/src/com/ibm/icu/impl/duration/BasicDurationFormat.java b/icu4j/src/com/ibm/icu/impl/duration/BasicDurationFormat.java index 004ac51313f..ff824597f50 100644 --- a/icu4j/src/com/ibm/icu/impl/duration/BasicDurationFormat.java +++ b/icu4j/src/com/ibm/icu/impl/duration/BasicDurationFormat.java @@ -6,6 +6,7 @@ */ package com.ibm.icu.impl.duration; +import java.text.FieldPosition; import java.util.Date; import com.ibm.icu.text.DurationFormat; @@ -13,7 +14,8 @@ import com.ibm.icu.util.ULocale; /** * @author srl - * + * @internal + * @deprecated this API is for ICU internal use only */ public class BasicDurationFormat extends DurationFormat { @@ -23,22 +25,43 @@ public class BasicDurationFormat extends DurationFormat { private static final long serialVersionUID = -3146984141909457700L; transient DurationFormatter formatter; + transient PeriodFormatter pformatter; + transient PeriodFormatterService pfs = null; public static DurationFormat getInstance(ULocale locale) { return new BasicDurationFormat(locale); } - + public StringBuffer format(Object object, StringBuffer toAppend, FieldPosition pos) { + if(object instanceof Long) { + String res = formatDurationFromNow(((Long)object).longValue()); + return toAppend.append(res); + } else if(object instanceof Date) { + String res = formatDurationFromNowTo(((Date)object)); + return toAppend.append(res); + // BEGIN JDK>1.5 + } else if(object instanceof javax.xml.datatype.Duration) { + String res = formatDuration(object); + return toAppend.append(res); + // END JDK>1.5 + } else { + throw new IllegalArgumentException("Cannot format given Object as a Duration"); + } + } public BasicDurationFormat() { - formatter = BasicPeriodFormatterService.getInstance().newDurationFormatterFactory().getFormatter(); + pfs = BasicPeriodFormatterService.getInstance(); + formatter = pfs.newDurationFormatterFactory().getFormatter(); + pformatter = pfs.newPeriodFormatterFactory().setDisplayPastFuture(false).getFormatter(); } /** * */ public BasicDurationFormat(ULocale locale) { super(locale); - formatter = BasicPeriodFormatterService.getInstance().newDurationFormatterFactory().setLocale(locale.getName()).getFormatter(); + pfs = BasicPeriodFormatterService.getInstance(); + formatter = pfs.newDurationFormatterFactory().setLocale(locale.getName()).getFormatter(); + pformatter = pfs.newPeriodFormatterFactory().setDisplayPastFuture(false).setLocale(locale.getName()).getFormatter(); } /* (non-Javadoc) @@ -62,4 +85,64 @@ public class BasicDurationFormat extends DurationFormat { return formatter.formatDurationFromNowTo(targetDate); } + // BEGIN JDK>1.5 + private static final javax.xml.datatype.DatatypeConstants.Field inFields[] = { + javax.xml.datatype.DatatypeConstants.YEARS, + javax.xml.datatype.DatatypeConstants.MONTHS, + javax.xml.datatype.DatatypeConstants.DAYS, + javax.xml.datatype.DatatypeConstants.HOURS, + javax.xml.datatype.DatatypeConstants.MINUTES, + javax.xml.datatype.DatatypeConstants.SECONDS, + }; + private static final TimeUnit outFields[] = { + TimeUnit.YEAR, + TimeUnit.MONTH, + TimeUnit.DAY, + TimeUnit.HOUR, + TimeUnit.MINUTE, + TimeUnit.SECOND, + }; + /** + * JDK 1.5+ only + * @param o + * @return + * @see http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/datatype/Duration.html + */ + public String formatDuration(Object obj) { + javax.xml.datatype.Duration inDuration = (javax.xml.datatype.Duration)obj; + Period p = null; + javax.xml.datatype.Duration duration = inDuration; + boolean inPast = false; + if(inDuration.getSign()<0) { + duration = inDuration.negate(); + inPast = true; + } + // convert a Duration to a Period + for(int i=0;i1.5 + } diff --git a/icu4j/src/com/ibm/icu/text/DurationFormat.java b/icu4j/src/com/ibm/icu/text/DurationFormat.java index 78358b4fcf9..48b913c9d7f 100644 --- a/icu4j/src/com/ibm/icu/text/DurationFormat.java +++ b/icu4j/src/com/ibm/icu/text/DurationFormat.java @@ -51,25 +51,15 @@ public abstract class DurationFormat extends UFormat { /** * Format an arbitrary object. * Defaults to a call to formatDurationFromNow() for either Long or Date objects. - * @param object the object to format. Should be either a Long or Date object. + * @param object the object to format. Should be either a Long, Date, or javax.xml.datatype.Duration object. * @param toAppend the buffer to append to * @param pos the field position, may contain additional error messages. * @return the toAppend buffer * @draft ICU 3.8 * @provisional This API might change or be removed in a future release. */ - public StringBuffer format(Object object, StringBuffer toAppend, - FieldPosition pos) { - if(object instanceof Long) { - String res = formatDurationFromNow(((Long)object).longValue()); - return toAppend.append(res); - } else if(object instanceof Date) { - String res = formatDurationFromNowTo(((Date)object)); - return toAppend.append(res); - } else { - throw new IllegalArgumentException("Cannot format given Object as a Duration"); - } - } + public abstract StringBuffer format(Object object, StringBuffer toAppend, + FieldPosition pos); /** * DurationFormat cannot parse, by default. This method will throw an UnsupportedOperationException.