comparison libs/commons-math-2.1/docs/apidocs/src-html/org/apache/commons/math/fraction/ProperFractionFormat.html @ 13:cbf34dd4d7e6

commons-math-2.1 added
author dwinter
date Tue, 04 Jan 2011 10:02:07 +0100
parents
children
comparison
equal deleted inserted replaced
12:970d26a94fb7 13:cbf34dd4d7e6
1 <HTML>
2 <BODY BGCOLOR="white">
3 <PRE>
4 <FONT color="green">001</FONT> /*<a name="line.1"></a>
5 <FONT color="green">002</FONT> * Licensed to the Apache Software Foundation (ASF) under one or more<a name="line.2"></a>
6 <FONT color="green">003</FONT> * contributor license agreements. See the NOTICE file distributed with<a name="line.3"></a>
7 <FONT color="green">004</FONT> * this work for additional information regarding copyright ownership.<a name="line.4"></a>
8 <FONT color="green">005</FONT> * The ASF licenses this file to You under the Apache License, Version 2.0<a name="line.5"></a>
9 <FONT color="green">006</FONT> * (the "License"); you may not use this file except in compliance with<a name="line.6"></a>
10 <FONT color="green">007</FONT> * the License. You may obtain a copy of the License at<a name="line.7"></a>
11 <FONT color="green">008</FONT> *<a name="line.8"></a>
12 <FONT color="green">009</FONT> * http://www.apache.org/licenses/LICENSE-2.0<a name="line.9"></a>
13 <FONT color="green">010</FONT> *<a name="line.10"></a>
14 <FONT color="green">011</FONT> * Unless required by applicable law or agreed to in writing, software<a name="line.11"></a>
15 <FONT color="green">012</FONT> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.12"></a>
16 <FONT color="green">013</FONT> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.13"></a>
17 <FONT color="green">014</FONT> * See the License for the specific language governing permissions and<a name="line.14"></a>
18 <FONT color="green">015</FONT> * limitations under the License.<a name="line.15"></a>
19 <FONT color="green">016</FONT> */<a name="line.16"></a>
20 <FONT color="green">017</FONT> package org.apache.commons.math.fraction;<a name="line.17"></a>
21 <FONT color="green">018</FONT> <a name="line.18"></a>
22 <FONT color="green">019</FONT> import java.text.FieldPosition;<a name="line.19"></a>
23 <FONT color="green">020</FONT> import java.text.NumberFormat;<a name="line.20"></a>
24 <FONT color="green">021</FONT> import java.text.ParsePosition;<a name="line.21"></a>
25 <FONT color="green">022</FONT> <a name="line.22"></a>
26 <FONT color="green">023</FONT> import org.apache.commons.math.MathRuntimeException;<a name="line.23"></a>
27 <FONT color="green">024</FONT> import org.apache.commons.math.util.MathUtils;<a name="line.24"></a>
28 <FONT color="green">025</FONT> <a name="line.25"></a>
29 <FONT color="green">026</FONT> /**<a name="line.26"></a>
30 <FONT color="green">027</FONT> * Formats a Fraction number in proper format. The number format for each of<a name="line.27"></a>
31 <FONT color="green">028</FONT> * the whole number, numerator and, denominator can be configured.<a name="line.28"></a>
32 <FONT color="green">029</FONT> * &lt;p&gt;<a name="line.29"></a>
33 <FONT color="green">030</FONT> * Minus signs are only allowed in the whole number part - i.e.,<a name="line.30"></a>
34 <FONT color="green">031</FONT> * "-3 1/2" is legitimate and denotes -7/2, but "-3 -1/2" is invalid and<a name="line.31"></a>
35 <FONT color="green">032</FONT> * will result in a &lt;code&gt;ParseException&lt;/code&gt;.&lt;/p&gt;<a name="line.32"></a>
36 <FONT color="green">033</FONT> *<a name="line.33"></a>
37 <FONT color="green">034</FONT> * @since 1.1<a name="line.34"></a>
38 <FONT color="green">035</FONT> * @version $Revision: 811685 $ $Date: 2009-09-05 13:36:48 -0400 (Sat, 05 Sep 2009) $<a name="line.35"></a>
39 <FONT color="green">036</FONT> */<a name="line.36"></a>
40 <FONT color="green">037</FONT> public class ProperFractionFormat extends FractionFormat {<a name="line.37"></a>
41 <FONT color="green">038</FONT> <a name="line.38"></a>
42 <FONT color="green">039</FONT> /** Serializable version identifier */<a name="line.39"></a>
43 <FONT color="green">040</FONT> private static final long serialVersionUID = 760934726031766749L;<a name="line.40"></a>
44 <FONT color="green">041</FONT> <a name="line.41"></a>
45 <FONT color="green">042</FONT> /** The format used for the whole number. */<a name="line.42"></a>
46 <FONT color="green">043</FONT> private NumberFormat wholeFormat;<a name="line.43"></a>
47 <FONT color="green">044</FONT> <a name="line.44"></a>
48 <FONT color="green">045</FONT> /**<a name="line.45"></a>
49 <FONT color="green">046</FONT> * Create a proper formatting instance with the default number format for<a name="line.46"></a>
50 <FONT color="green">047</FONT> * the whole, numerator, and denominator.<a name="line.47"></a>
51 <FONT color="green">048</FONT> */<a name="line.48"></a>
52 <FONT color="green">049</FONT> public ProperFractionFormat() {<a name="line.49"></a>
53 <FONT color="green">050</FONT> this(getDefaultNumberFormat());<a name="line.50"></a>
54 <FONT color="green">051</FONT> }<a name="line.51"></a>
55 <FONT color="green">052</FONT> <a name="line.52"></a>
56 <FONT color="green">053</FONT> /**<a name="line.53"></a>
57 <FONT color="green">054</FONT> * Create a proper formatting instance with a custom number format for the<a name="line.54"></a>
58 <FONT color="green">055</FONT> * whole, numerator, and denominator.<a name="line.55"></a>
59 <FONT color="green">056</FONT> * @param format the custom format for the whole, numerator, and<a name="line.56"></a>
60 <FONT color="green">057</FONT> * denominator.<a name="line.57"></a>
61 <FONT color="green">058</FONT> */<a name="line.58"></a>
62 <FONT color="green">059</FONT> public ProperFractionFormat(NumberFormat format) {<a name="line.59"></a>
63 <FONT color="green">060</FONT> this(format, (NumberFormat)format.clone(), (NumberFormat)format.clone());<a name="line.60"></a>
64 <FONT color="green">061</FONT> }<a name="line.61"></a>
65 <FONT color="green">062</FONT> <a name="line.62"></a>
66 <FONT color="green">063</FONT> /**<a name="line.63"></a>
67 <FONT color="green">064</FONT> * Create a proper formatting instance with a custom number format for each<a name="line.64"></a>
68 <FONT color="green">065</FONT> * of the whole, numerator, and denominator.<a name="line.65"></a>
69 <FONT color="green">066</FONT> * @param wholeFormat the custom format for the whole.<a name="line.66"></a>
70 <FONT color="green">067</FONT> * @param numeratorFormat the custom format for the numerator.<a name="line.67"></a>
71 <FONT color="green">068</FONT> * @param denominatorFormat the custom format for the denominator.<a name="line.68"></a>
72 <FONT color="green">069</FONT> */<a name="line.69"></a>
73 <FONT color="green">070</FONT> public ProperFractionFormat(NumberFormat wholeFormat,<a name="line.70"></a>
74 <FONT color="green">071</FONT> NumberFormat numeratorFormat,<a name="line.71"></a>
75 <FONT color="green">072</FONT> NumberFormat denominatorFormat)<a name="line.72"></a>
76 <FONT color="green">073</FONT> {<a name="line.73"></a>
77 <FONT color="green">074</FONT> super(numeratorFormat, denominatorFormat);<a name="line.74"></a>
78 <FONT color="green">075</FONT> setWholeFormat(wholeFormat);<a name="line.75"></a>
79 <FONT color="green">076</FONT> }<a name="line.76"></a>
80 <FONT color="green">077</FONT> <a name="line.77"></a>
81 <FONT color="green">078</FONT> /**<a name="line.78"></a>
82 <FONT color="green">079</FONT> * Formats a {@link Fraction} object to produce a string. The fraction<a name="line.79"></a>
83 <FONT color="green">080</FONT> * is output in proper format.<a name="line.80"></a>
84 <FONT color="green">081</FONT> *<a name="line.81"></a>
85 <FONT color="green">082</FONT> * @param fraction the object to format.<a name="line.82"></a>
86 <FONT color="green">083</FONT> * @param toAppendTo where the text is to be appended<a name="line.83"></a>
87 <FONT color="green">084</FONT> * @param pos On input: an alignment field, if desired. On output: the<a name="line.84"></a>
88 <FONT color="green">085</FONT> * offsets of the alignment field<a name="line.85"></a>
89 <FONT color="green">086</FONT> * @return the value passed in as toAppendTo.<a name="line.86"></a>
90 <FONT color="green">087</FONT> */<a name="line.87"></a>
91 <FONT color="green">088</FONT> @Override<a name="line.88"></a>
92 <FONT color="green">089</FONT> public StringBuffer format(Fraction fraction, StringBuffer toAppendTo,<a name="line.89"></a>
93 <FONT color="green">090</FONT> FieldPosition pos) {<a name="line.90"></a>
94 <FONT color="green">091</FONT> <a name="line.91"></a>
95 <FONT color="green">092</FONT> pos.setBeginIndex(0);<a name="line.92"></a>
96 <FONT color="green">093</FONT> pos.setEndIndex(0);<a name="line.93"></a>
97 <FONT color="green">094</FONT> <a name="line.94"></a>
98 <FONT color="green">095</FONT> int num = fraction.getNumerator();<a name="line.95"></a>
99 <FONT color="green">096</FONT> int den = fraction.getDenominator();<a name="line.96"></a>
100 <FONT color="green">097</FONT> int whole = num / den;<a name="line.97"></a>
101 <FONT color="green">098</FONT> num = num % den;<a name="line.98"></a>
102 <FONT color="green">099</FONT> <a name="line.99"></a>
103 <FONT color="green">100</FONT> if (whole != 0) {<a name="line.100"></a>
104 <FONT color="green">101</FONT> getWholeFormat().format(whole, toAppendTo, pos);<a name="line.101"></a>
105 <FONT color="green">102</FONT> toAppendTo.append(' ');<a name="line.102"></a>
106 <FONT color="green">103</FONT> num = Math.abs(num);<a name="line.103"></a>
107 <FONT color="green">104</FONT> }<a name="line.104"></a>
108 <FONT color="green">105</FONT> getNumeratorFormat().format(num, toAppendTo, pos);<a name="line.105"></a>
109 <FONT color="green">106</FONT> toAppendTo.append(" / ");<a name="line.106"></a>
110 <FONT color="green">107</FONT> getDenominatorFormat().format(den, toAppendTo,<a name="line.107"></a>
111 <FONT color="green">108</FONT> pos);<a name="line.108"></a>
112 <FONT color="green">109</FONT> <a name="line.109"></a>
113 <FONT color="green">110</FONT> return toAppendTo;<a name="line.110"></a>
114 <FONT color="green">111</FONT> }<a name="line.111"></a>
115 <FONT color="green">112</FONT> <a name="line.112"></a>
116 <FONT color="green">113</FONT> /**<a name="line.113"></a>
117 <FONT color="green">114</FONT> * Access the whole format.<a name="line.114"></a>
118 <FONT color="green">115</FONT> * @return the whole format.<a name="line.115"></a>
119 <FONT color="green">116</FONT> */<a name="line.116"></a>
120 <FONT color="green">117</FONT> public NumberFormat getWholeFormat() {<a name="line.117"></a>
121 <FONT color="green">118</FONT> return wholeFormat;<a name="line.118"></a>
122 <FONT color="green">119</FONT> }<a name="line.119"></a>
123 <FONT color="green">120</FONT> <a name="line.120"></a>
124 <FONT color="green">121</FONT> /**<a name="line.121"></a>
125 <FONT color="green">122</FONT> * Parses a string to produce a {@link Fraction} object. This method<a name="line.122"></a>
126 <FONT color="green">123</FONT> * expects the string to be formatted as a proper fraction.<a name="line.123"></a>
127 <FONT color="green">124</FONT> * &lt;p&gt;<a name="line.124"></a>
128 <FONT color="green">125</FONT> * Minus signs are only allowed in the whole number part - i.e.,<a name="line.125"></a>
129 <FONT color="green">126</FONT> * "-3 1/2" is legitimate and denotes -7/2, but "-3 -1/2" is invalid and<a name="line.126"></a>
130 <FONT color="green">127</FONT> * will result in a &lt;code&gt;ParseException&lt;/code&gt;.&lt;/p&gt;<a name="line.127"></a>
131 <FONT color="green">128</FONT> *<a name="line.128"></a>
132 <FONT color="green">129</FONT> * @param source the string to parse<a name="line.129"></a>
133 <FONT color="green">130</FONT> * @param pos input/ouput parsing parameter.<a name="line.130"></a>
134 <FONT color="green">131</FONT> * @return the parsed {@link Fraction} object.<a name="line.131"></a>
135 <FONT color="green">132</FONT> */<a name="line.132"></a>
136 <FONT color="green">133</FONT> @Override<a name="line.133"></a>
137 <FONT color="green">134</FONT> public Fraction parse(String source, ParsePosition pos) {<a name="line.134"></a>
138 <FONT color="green">135</FONT> // try to parse improper fraction<a name="line.135"></a>
139 <FONT color="green">136</FONT> Fraction ret = super.parse(source, pos);<a name="line.136"></a>
140 <FONT color="green">137</FONT> if (ret != null) {<a name="line.137"></a>
141 <FONT color="green">138</FONT> return ret;<a name="line.138"></a>
142 <FONT color="green">139</FONT> }<a name="line.139"></a>
143 <FONT color="green">140</FONT> <a name="line.140"></a>
144 <FONT color="green">141</FONT> int initialIndex = pos.getIndex();<a name="line.141"></a>
145 <FONT color="green">142</FONT> <a name="line.142"></a>
146 <FONT color="green">143</FONT> // parse whitespace<a name="line.143"></a>
147 <FONT color="green">144</FONT> parseAndIgnoreWhitespace(source, pos);<a name="line.144"></a>
148 <FONT color="green">145</FONT> <a name="line.145"></a>
149 <FONT color="green">146</FONT> // parse whole<a name="line.146"></a>
150 <FONT color="green">147</FONT> Number whole = getWholeFormat().parse(source, pos);<a name="line.147"></a>
151 <FONT color="green">148</FONT> if (whole == null) {<a name="line.148"></a>
152 <FONT color="green">149</FONT> // invalid integer number<a name="line.149"></a>
153 <FONT color="green">150</FONT> // set index back to initial, error index should already be set<a name="line.150"></a>
154 <FONT color="green">151</FONT> // character examined.<a name="line.151"></a>
155 <FONT color="green">152</FONT> pos.setIndex(initialIndex);<a name="line.152"></a>
156 <FONT color="green">153</FONT> return null;<a name="line.153"></a>
157 <FONT color="green">154</FONT> }<a name="line.154"></a>
158 <FONT color="green">155</FONT> <a name="line.155"></a>
159 <FONT color="green">156</FONT> // parse whitespace<a name="line.156"></a>
160 <FONT color="green">157</FONT> parseAndIgnoreWhitespace(source, pos);<a name="line.157"></a>
161 <FONT color="green">158</FONT> <a name="line.158"></a>
162 <FONT color="green">159</FONT> // parse numerator<a name="line.159"></a>
163 <FONT color="green">160</FONT> Number num = getNumeratorFormat().parse(source, pos);<a name="line.160"></a>
164 <FONT color="green">161</FONT> if (num == null) {<a name="line.161"></a>
165 <FONT color="green">162</FONT> // invalid integer number<a name="line.162"></a>
166 <FONT color="green">163</FONT> // set index back to initial, error index should already be set<a name="line.163"></a>
167 <FONT color="green">164</FONT> // character examined.<a name="line.164"></a>
168 <FONT color="green">165</FONT> pos.setIndex(initialIndex);<a name="line.165"></a>
169 <FONT color="green">166</FONT> return null;<a name="line.166"></a>
170 <FONT color="green">167</FONT> }<a name="line.167"></a>
171 <FONT color="green">168</FONT> <a name="line.168"></a>
172 <FONT color="green">169</FONT> if (num.intValue() &lt; 0) {<a name="line.169"></a>
173 <FONT color="green">170</FONT> // minus signs should be leading, invalid expression<a name="line.170"></a>
174 <FONT color="green">171</FONT> pos.setIndex(initialIndex);<a name="line.171"></a>
175 <FONT color="green">172</FONT> return null;<a name="line.172"></a>
176 <FONT color="green">173</FONT> }<a name="line.173"></a>
177 <FONT color="green">174</FONT> <a name="line.174"></a>
178 <FONT color="green">175</FONT> // parse '/'<a name="line.175"></a>
179 <FONT color="green">176</FONT> int startIndex = pos.getIndex();<a name="line.176"></a>
180 <FONT color="green">177</FONT> char c = parseNextCharacter(source, pos);<a name="line.177"></a>
181 <FONT color="green">178</FONT> switch (c) {<a name="line.178"></a>
182 <FONT color="green">179</FONT> case 0 :<a name="line.179"></a>
183 <FONT color="green">180</FONT> // no '/'<a name="line.180"></a>
184 <FONT color="green">181</FONT> // return num as a fraction<a name="line.181"></a>
185 <FONT color="green">182</FONT> return new Fraction(num.intValue(), 1);<a name="line.182"></a>
186 <FONT color="green">183</FONT> case '/' :<a name="line.183"></a>
187 <FONT color="green">184</FONT> // found '/', continue parsing denominator<a name="line.184"></a>
188 <FONT color="green">185</FONT> break;<a name="line.185"></a>
189 <FONT color="green">186</FONT> default :<a name="line.186"></a>
190 <FONT color="green">187</FONT> // invalid '/'<a name="line.187"></a>
191 <FONT color="green">188</FONT> // set index back to initial, error index should be the last<a name="line.188"></a>
192 <FONT color="green">189</FONT> // character examined.<a name="line.189"></a>
193 <FONT color="green">190</FONT> pos.setIndex(initialIndex);<a name="line.190"></a>
194 <FONT color="green">191</FONT> pos.setErrorIndex(startIndex);<a name="line.191"></a>
195 <FONT color="green">192</FONT> return null;<a name="line.192"></a>
196 <FONT color="green">193</FONT> }<a name="line.193"></a>
197 <FONT color="green">194</FONT> <a name="line.194"></a>
198 <FONT color="green">195</FONT> // parse whitespace<a name="line.195"></a>
199 <FONT color="green">196</FONT> parseAndIgnoreWhitespace(source, pos);<a name="line.196"></a>
200 <FONT color="green">197</FONT> <a name="line.197"></a>
201 <FONT color="green">198</FONT> // parse denominator<a name="line.198"></a>
202 <FONT color="green">199</FONT> Number den = getDenominatorFormat().parse(source, pos);<a name="line.199"></a>
203 <FONT color="green">200</FONT> if (den == null) {<a name="line.200"></a>
204 <FONT color="green">201</FONT> // invalid integer number<a name="line.201"></a>
205 <FONT color="green">202</FONT> // set index back to initial, error index should already be set<a name="line.202"></a>
206 <FONT color="green">203</FONT> // character examined.<a name="line.203"></a>
207 <FONT color="green">204</FONT> pos.setIndex(initialIndex);<a name="line.204"></a>
208 <FONT color="green">205</FONT> return null;<a name="line.205"></a>
209 <FONT color="green">206</FONT> }<a name="line.206"></a>
210 <FONT color="green">207</FONT> <a name="line.207"></a>
211 <FONT color="green">208</FONT> if (den.intValue() &lt; 0) {<a name="line.208"></a>
212 <FONT color="green">209</FONT> // minus signs must be leading, invalid<a name="line.209"></a>
213 <FONT color="green">210</FONT> pos.setIndex(initialIndex);<a name="line.210"></a>
214 <FONT color="green">211</FONT> return null;<a name="line.211"></a>
215 <FONT color="green">212</FONT> }<a name="line.212"></a>
216 <FONT color="green">213</FONT> <a name="line.213"></a>
217 <FONT color="green">214</FONT> int w = whole.intValue();<a name="line.214"></a>
218 <FONT color="green">215</FONT> int n = num.intValue();<a name="line.215"></a>
219 <FONT color="green">216</FONT> int d = den.intValue();<a name="line.216"></a>
220 <FONT color="green">217</FONT> return new Fraction(((Math.abs(w) * d) + n) * MathUtils.sign(w), d);<a name="line.217"></a>
221 <FONT color="green">218</FONT> }<a name="line.218"></a>
222 <FONT color="green">219</FONT> <a name="line.219"></a>
223 <FONT color="green">220</FONT> /**<a name="line.220"></a>
224 <FONT color="green">221</FONT> * Modify the whole format.<a name="line.221"></a>
225 <FONT color="green">222</FONT> * @param format The new whole format value.<a name="line.222"></a>
226 <FONT color="green">223</FONT> * @throws IllegalArgumentException if &lt;code&gt;format&lt;/code&gt; is<a name="line.223"></a>
227 <FONT color="green">224</FONT> * &lt;code&gt;null&lt;/code&gt;.<a name="line.224"></a>
228 <FONT color="green">225</FONT> */<a name="line.225"></a>
229 <FONT color="green">226</FONT> public void setWholeFormat(NumberFormat format) {<a name="line.226"></a>
230 <FONT color="green">227</FONT> if (format == null) {<a name="line.227"></a>
231 <FONT color="green">228</FONT> throw MathRuntimeException.createIllegalArgumentException(<a name="line.228"></a>
232 <FONT color="green">229</FONT> "whole format can not be null");<a name="line.229"></a>
233 <FONT color="green">230</FONT> }<a name="line.230"></a>
234 <FONT color="green">231</FONT> this.wholeFormat = format;<a name="line.231"></a>
235 <FONT color="green">232</FONT> }<a name="line.232"></a>
236 <FONT color="green">233</FONT> }<a name="line.233"></a>
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297 </PRE>
298 </BODY>
299 </HTML>