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