]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_2_1-src/src/com/ibm/icu/impl/duration/BasicDurationFormat.java
4e4c3a5a284cf08a162348acc2e58cf14522758f
[Dictionary.git] / jars / icu4j-4_2_1-src / src / com / ibm / icu / impl / duration / BasicDurationFormat.java
1 //##header J2SE15
2 /*
3  *******************************************************************************
4  * Copyright (C) 2007-2009, International Business Machines Corporation and    *
5  * others. All Rights Reserved.                                                *
6  *******************************************************************************
7  */
8 package com.ibm.icu.impl.duration;
9
10 import java.text.FieldPosition;
11 import java.util.Date;
12
13 import com.ibm.icu.text.DurationFormat;
14 import com.ibm.icu.util.ULocale;
15
16 /**
17  * @author srl
18  */
19 public class BasicDurationFormat extends DurationFormat {
20     
21     /**
22      * 
23      */
24     private static final long serialVersionUID = -3146984141909457700L;
25     
26     transient DurationFormatter formatter;
27     transient PeriodFormatter pformatter;
28     transient PeriodFormatterService pfs = null;
29
30     public static DurationFormat getInstance(ULocale locale) {
31         return new BasicDurationFormat(locale);
32     }
33
34 //#if defined(FOUNDATION10) || defined(J2SE13) || defined(J2SE14)
35 //#else
36     private static boolean checkXMLDuration = true; 
37 //#endif
38
39     public StringBuffer format(Object object, StringBuffer toAppend, FieldPosition pos) {
40         if(object instanceof Long) {
41             String res = formatDurationFromNow(((Long)object).longValue());
42             return toAppend.append(res);
43         } else if(object instanceof Date) {
44             String res = formatDurationFromNowTo(((Date)object));
45             return toAppend.append(res);
46         }
47 //#if defined(FOUNDATION10) || defined(J2SE13) || defined(J2SE14)
48 //#else
49         if(checkXMLDuration) try {
50             if(object instanceof javax.xml.datatype.Duration) {
51                 String res = formatDuration(object);
52                 return toAppend.append(res);
53             }
54         } catch ( NoClassDefFoundError ncdfe ) {
55             System.err.println("Skipping XML capability");
56             checkXMLDuration = false; // don't try again
57         }
58 //#endif
59         throw new IllegalArgumentException("Cannot format given Object as a Duration");
60
61     }
62     
63     public BasicDurationFormat() {
64         pfs = BasicPeriodFormatterService.getInstance();
65         formatter = pfs.newDurationFormatterFactory().getFormatter();
66         pformatter = pfs.newPeriodFormatterFactory().setDisplayPastFuture(false).getFormatter();
67     }
68     /**
69      * 
70      */
71     public BasicDurationFormat(ULocale locale) {
72         super(locale);
73         pfs = BasicPeriodFormatterService.getInstance();
74         formatter = pfs.newDurationFormatterFactory().setLocale(locale.getName()).getFormatter();
75         pformatter = pfs.newPeriodFormatterFactory().setDisplayPastFuture(false).setLocale(locale.getName()).getFormatter();
76     }
77
78     /* (non-Javadoc)
79      * @see com.ibm.icu.text.DurationFormat#formatDurationFrom(long, long)
80      */
81     public String formatDurationFrom(long duration, long referenceDate) {
82         return formatter.formatDurationFrom(duration, referenceDate);
83     }
84
85     /* (non-Javadoc)
86      * @see com.ibm.icu.text.DurationFormat#formatDurationFromNow(long)
87      */
88     public String formatDurationFromNow(long duration) {
89         return formatter.formatDurationFromNow(duration);
90     }
91
92     /* (non-Javadoc)
93      * @see com.ibm.icu.text.DurationFormat#formatDurationFromNowTo(java.util.Date)
94      */
95     public String formatDurationFromNowTo(Date targetDate) {
96         return formatter.formatDurationFromNowTo(targetDate);
97     }
98
99 //#if defined(FOUNDATION10) || defined(J2SE13) || defined(J2SE14)
100 //#else
101     /** 
102      *  JDK 1.5+ only
103      * @param o
104      * @return
105      * @see http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/datatype/Duration.html
106      */
107     public String formatDuration(Object obj) {
108         javax.xml.datatype.DatatypeConstants.Field inFields[] = { 
109                 javax.xml.datatype.DatatypeConstants.YEARS,
110                 javax.xml.datatype.DatatypeConstants.MONTHS,
111                 javax.xml.datatype.DatatypeConstants.DAYS,
112                 javax.xml.datatype.DatatypeConstants.HOURS,
113                 javax.xml.datatype.DatatypeConstants.MINUTES,
114                 javax.xml.datatype.DatatypeConstants.SECONDS,
115             };
116              TimeUnit outFields[] = { 
117                 TimeUnit.YEAR,
118                 TimeUnit.MONTH,
119                 TimeUnit.DAY,
120                 TimeUnit.HOUR,
121                 TimeUnit.MINUTE,
122                 TimeUnit.SECOND,
123             };
124
125         javax.xml.datatype.Duration inDuration = (javax.xml.datatype.Duration)obj;
126         Period p = null;
127         javax.xml.datatype.Duration duration = inDuration;
128         boolean inPast = false;
129         if(inDuration.getSign()<0) {
130             duration = inDuration.negate();
131             inPast = true;
132         }
133         // convert a Duration to a Period
134         boolean sawNonZero = false; // did we have a set, non-zero field?
135         for(int i=0;i<inFields.length;i++) {
136             if(duration.isSet(inFields[i])) {
137                 Number n = duration.getField(inFields[i]);
138                 if(n.intValue() == 0 && !sawNonZero) {
139                     continue; // ignore zero fields larger than the largest nonzero field
140                 } else {
141                     sawNonZero = true;
142                 }
143                 float floatVal = n.floatValue();
144                 // is there a 'secondary' unit to set?
145                 TimeUnit alternateUnit = null;
146                 float alternateVal = 0;
147                 
148                 // see if there is a fractional part
149                 if(outFields[i]==TimeUnit.SECOND) {
150                     double fullSeconds = floatVal;
151                     double intSeconds = Math.floor(floatVal);
152                     double millis = (fullSeconds-intSeconds)*1000.0;
153                     if(millis > 0.0) {
154                         alternateUnit = TimeUnit.MILLISECOND;
155                         alternateVal=(float)millis;
156                         floatVal=(float)intSeconds;
157                     }
158                 }
159                 
160                 if(p == null) {
161                     p = Period.at(floatVal, outFields[i]);
162                 } else {
163                     p = p.and(floatVal, outFields[i]);
164                 }
165                 
166                 if(alternateUnit != null) {
167                     p = p.and(alternateVal, alternateUnit); // add in MILLISECONDs
168                 }
169             }
170         }
171         
172         if(p == null) {
173             // no fields set  = 0 seconds
174             return formatDurationFromNow(0);
175         } else {
176             if(inPast) {// was negated, above.
177                 p = p.inPast();
178             } else {
179                 p = p.inFuture();
180             }
181         }
182         
183         // now, format it.
184         return pformatter.format(p);
185     }
186 //#endif
187 }