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