summaryrefslogtreecommitdiff
path: root/framework/I18N/TNumberFormat.php
blob: 9f2de233618f4a21a6b47c4b43f08f73eb38639a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
<?php
/**
 * TNumberFromat component.
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the BSD License.
 *
 * Copyright(c) 2004 by Xiang Wei Zhuo. 
 *
 * To contact the author write to {@link mailto:qiang.xue@gmail.com Qiang Xue}
 * The latest version of PRADO can be obtained from:
 * {@link http://prado.sourceforge.net/}
 *
 * @author Xiang Wei Zhuo <weizhuo[at]gmail[dot]com>
 * @version $Revision: 1.7 $  $Date: 2005/12/15 07:14:49 $
 * @package System.I18N
 */

 /**
 * Get the NumberFormat class.
 */
Prado::using('System.I18N.core.NumberFormat');


/**
  * To format numbers in locale sensitive manner use 
  * <code>
  * <com:TNumberFormat Pattern="0.##" value="2.0" />
  * </code>
  * 
  * Numbers can be formatted as currency, percentage, decimal or scientific
  * numbers by specifying the Type attribute. The known types are 
  * "currency", "percentage", "decimal" and "scientific".
  *
  * If someone from US want to see sales figures from a store in 
  * Germany (say using the EURO currency), formatted using the german 
  * currency, you would need to use the attribute Culture="de_DE" to get 
  * the currency right, e.g. 100,00 â‚?. The decimal and grouping separator is 
  * then also from the de_DE locale. This may lead to some confusion because 
  * people from US know the "," as thousand separator. Therefore a "Currency"
  * attribute is available, so that the output from the following example
  * results in â‚?100.00
  * <code>
  * <com:TNumberFormat Type="currency" Culture="en_US" Currency="EUR" Value="100" />
  * </code>
  *  
  * Namespace: System.I18N
  *
  * Properties
  * - <b>Value</b>, number, 
  *   <br>Gets or sets the number to format. The tag content is used as Value
  *   if the Value property is not specified.
  * - <b>Type</b>, string,
  *   <br>Gets or sets the formatting type. The valid types are 
  *    'decimal', 'currency', 'percentage' and 'scientific'.
  * - <b>Currency</b>, string, 
  *   <br>Gets or sets the currency symbol for the currency format.
  *   The default is 'USD' if the Currency property is not specified.
  * - <b>Pattern</b>, string,
  *   <br>Gets or sets the custom number formatting pattern.
  *
  * @author Xiang Wei Zhuo <weizhuo[at]gmail[dot]com>
  * @version v1.0, last update on Sat Dec 11 17:49:56 EST 2004
  * @package System.I18N
  */ 
class TNumberFormat extends TI18NControl 
{
	/**
	 * Default NumberFormat, set to the application culture.
	 * @var NumberFormat 
	 */
	protected static $formatter;
	
	/**
	 * Get the number formatting pattern.
	 * @return string format pattern.
	 */
	function getPattern()
	{
		return $this->getViewState('Pattern','');
	}
	
	/**
	 * Set the number format pattern.
	 * @param string format pattern.
	 */
	function setPattern($pattern)
	{
		$this->setViewState('Pattern',$pattern,'');
	}
	
	/**
	 * Get the numberic value for this control.
	 * @return string number
	 */
	function getValue()
	{		
		return $this->getViewState('Value','');
	}
	
	/**
	 * Set the numberic value for this control.
	 * @param string the number value
	 */
	function setValue($value)
	{
		$this->setViewState('Value',$value,'');
	}
	
	/**
	 * Get the formatting type for this control.
	 * @return string formatting type.
	 */
	function getType()
	{
		$type = $this->getViewState('Type','');
		if(empty($type))
			return 'd';
		return $type;
	}
	
	/**
	 * Set the formatting type for this control.
	 * @param string formatting type, either "decimal", "currency","percentage" 
	 * or "scientific"
	 * @throws TPropertyTypeInvalidException
	 */
	function setType($type)
	{
		$type = strtolower($type);
		
		switch($type)
		{
			case 'decimal':
				$this->setViewState('Type','d',''); break;
			case 'currency':
				$this->setViewState('Type','c',''); break;
			case 'percentage':
				$this->setViewState('Type','p',''); break;
			case 'scientific':
				$this->setViewState('Type','e',''); break;
			default:
				throw new TPropertyTypeInvalidException($this,'Type',$type);
		}
		
	}
	
	/**
	 * Get the currency for this control.
	 * @param parameter
	 * @return string 3 letter currency code. 
	 */
	function getCurrency()
	{
		$currency = $this->getViewState('Currency','');
		if(empty($currency))
			return 'USD';
		return $currency;
	}
	
	/**
	 * Set the 3-letter ISO 4217 code. For example, the code 
	 * "USD" represents the US Dollar and "EUR" represents the Euro currency.
	 * @param string currency code.
	 */
	function setCurrency($currency)
	{
		$this->setViewState('Currency', $currency,'');
	}	
	
	/**
	 * Formats the localized number, be it currency or decimal, or percentage.
	 * If the culture is not specified, the default application
	 * culture will be used.
	 * @return string formatted number
	 */	
	protected function getFormattedValue()
	{
		$app = $this->Application->getGlobalization();
		//initialized the default class wide formatter
		if(is_null(self::$formatter))
			self::$formatter = new NumberFormat($app->getCulture());
	
		$pattern = strlen($this->getPattern()) > 0 
						? $this->getPattern() : $this->getType();
		
		$culture = $this->getCulture();
		//return the specific cultural formatted number
		if(!empty($culture) && $app->getCulture() != $culture)
		{
			$formatter = new NumberFormat($culture);
			return $formatter->format($this->getValue(),$pattern,
									  $this->getCurrency(),
									  $this->getCharset());
		}
			
		//return the application wide culture formatted number.
		return self::$formatter->format($this->getValue(),$pattern,
										$this->getCurrency(), 
										$this->getCharset());
	}

	protected function render($writer)
	{
		$writer->write($this->getFormattedValue());
	}
}

?>