CNumberFormatter
| Пакет | system.i18n |
|---|---|
| Наследование | класс CNumberFormatter » CComponent |
| С версии | 1.0 |
| Исходный код | framework/i18n/CNumberFormatter.php |
CNumberFormatter форматирует число (целое или с плавающей точкой) и выводит строку на основе заданного формата. Экземпляр CNumberFormatter связан с языковой локалью и, следовательно, генерирует строковое представление числа в зависимости от локали.
CNumberFormatter в настоящее время поддерживает формат валюты, процентный формат, десятичный формат и пользовательский формат. Первые три формата определяются в данных локали, а пользовательский формат позволяет ввести произвольную строку формата.
Строка формата может состоять из следующих специальных символов:
- точка (.) – десятичная точка. Она будет заменена на локальную десятичную точку.
- запятая (,) – разделитель групп разрядов. Она будет заменена на локальный разделитель групп разрядов.
- ноль (0) – обязательная цифра. Это определяет места, где должна отображаться цифра (будет дополняться нулями, если необходимо).
- решётка (#) – необязательная цифра. Она в основном используется для указания расположения десятичной точки и разделителей групп разрядов.
- валюта (¤) – заполнитель валюты. Он будет заменён на локальный символ валюты.
- процент (%) – знак процента. Если он присутствует, число будет умножено на 100 перед форматированием.
- промилле (‰) – знак промилле. Если он присутствует, число будет умножено на 1000 перед форматированием.
- точка с запятой (;): символ, разделяющий подшаблоны для положительных и отрицательных чисел.
Всё, что окружает шаблон (или подшаблоны), сохранится.
Ниже приведены примеры:
Pattern "#,##0.00" will format 12345.678 as "12,345.68". Pattern "#,#,#0.00" will format 12345.6 as "1,2,3,45.60".Обратите внимание, что в первом примере число сначала округляется, а затем применяется форматирование. Во втором примере шаблон задаёт два размера группировки разрядов.
CNumberFormatter пытается реализовать форматирование чисел в соответствии с Техническим стандартом Unicode #35. Следующие функции НЕ реализованы:
- значимые цифры
- научный формат
- произвольные литеры
- произвольное заполнение
Общедоступные методы
| Метод | Описание | Определён в |
|---|---|---|
| __call() | Вызывает именованный метод, который не является методом класса. | CComponent |
| __construct() | Конструктор. | CNumberFormatter |
| __get() | Возвращает значение свойства, список обработчиков событий или поведение на основе его имени. | CComponent |
| __isset() | Проверяет, является ли значение свойства нулевым. | CComponent |
| __set() | Устанавливает значение свойства компонента. | CComponent |
| __unset() | Устанавливает свойство компонента в значение null. | CComponent |
| asa() | Возвращает объект поведения с заданным именем. | CComponent |
| attachBehavior() | Прикрепляет поведение к данному компоненту. | CComponent |
| attachBehaviors() | Прикрепляет список поведений к компоненту. | CComponent |
| attachEventHandler() | Прикрепляет обработчик события к событию. | CComponent |
| canGetProperty() | Определяет, может ли свойство быть прочитано. | CComponent |
| canSetProperty() | Определяет, может ли свойство быть установлено. | CComponent |
| detachBehavior() | Открепляет поведение от компонента. | CComponent |
| detachBehaviors() | Открепляет все поведения от компонента. | CComponent |
| detachEventHandler() | Открепляет существующий обработчик события. | CComponent |
| disableBehavior() | Отключает прикреплённое поведение. | CComponent |
| disableBehaviors() | Отключает все прикреплённые поведения к этому компоненту. | CComponent |
| enableBehavior() | Включает прикреплённое поведение. | CComponent |
| enableBehaviors() | Включает все прикреплённые поведения к этому компоненту. | CComponent |
| evaluateExpression() | Вычисляет PHP-выражение или обратный вызов в контексте этого компонента. | CComponent |
| format() | Форматирует число на основе указанного шаблона. | CNumberFormatter |
| formatCurrency() | Форматирует число с использованием формата валюты, определённого в локали. | CNumberFormatter |
| formatDecimal() | Форматирует число с использованием десятичного формата, определённого в локали. | CNumberFormatter |
| formatPercentage() | Форматирует число с использованием процентного формата, определённого в локали. | CNumberFormatter |
| getEventHandlers() | Возвращает список прикреплённых обработчиков событий для события. | CComponent |
| hasEvent() | Определяет, определено ли событие. | CComponent |
| hasEventHandler() | Проверяет, имеются ли прикреплённые обработчики для события с заданным именем. | CComponent |
| hasProperty() | Определяет, определено ли свойство. | CComponent |
| raiseEvent() | Вызывает событие. | CComponent |
Защищённые методы
| Метод | Описание | Определён в |
|---|---|---|
| formatNumber() | Форматирует число на основе формата. | CNumberFormatter |
| parseFormat() | Разбирает заданный шаблон строки. | CNumberFormatter |
Подробное описание методов
__construct() метод
public void __construct(mixed $locale) | ||
| $locale | mixed | идентификатор локали (строка) или экземпляр CLocale |
public function __construct($locale)
{
if(is_string($locale))
$this->_locale=CLocale::getInstance($locale);
else
$this->_locale=$locale;
}
Конструктор.
format() метод
public string format(string $pattern, mixed $value, string $currency=NULL) | ||
| $pattern | строка | шаблон формата |
| $value | смешанный тип | число, подлежащее форматированию |
| $currency | строка | код ISO 4217 (3 буквы). Например, код "USD" представляет доллар США, а "EUR" – евро. Знак валюты в шаблоне будет заменён символом валюты. Если null, замена не будет выполнена. |
| {return} | строка | результат форматирования. |
public function format($pattern,$value,$currency=null)
{
$format=$this->parseFormat($pattern);
$result=$this->formatNumber($format,$value);
if($currency===null)
return $result;
elseif(($symbol=$this->_locale->getCurrencySymbol($currency))===null)
$symbol=$currency;
return str_replace('¤',$symbol,$result);
}
Форматирует число на основе заданного шаблона. Обратите внимание, что если шаблон содержит '%', число будет предварительно умножено на 100. Если шаблон содержит '‰', число будет предварительно умножено на 1000. Если шаблон содержит знак валюты, он будет заменён указанным локальным символом валюты.
formatCurrency() метод
public string formatCurrency(mixed $value, string $currency) | ||
| $value | смешанный | число, которое нужно отформатировать |
| $currency | строка | Код ISO 4217 из 3 букв. Например, код "USD" представляет доллар США, а "EUR" — евро. Заполнитель валюты в шаблоне будет заменён символом валюты. |
| {return} | строка | результат форматирования. |
public function formatCurrency($value,$currency)
{
return $this->format($this->_locale->getCurrencyFormat(),$value,$currency);
}
Форматирует число с использованием формата валюты, определённого в локали.
formatDecimal() метод
public string formatDecimal(mixed $value) | ||
| $value | смешанный | число, которое нужно отформатировать |
| {return} | строка | результат форматирования. |
public function formatDecimal($value)
{
return $this->format($this->_locale->getDecimalFormat(),$value);
}
Форматирует число с использованием десятичного формата, определённого в локали.
formatNumber() метод
protected string formatNumber(array $format, mixed $value) | ||
| $format | массив | формат со следующей структурой:
array(
// number of required digits after the decimal point,
// will be padded with 0 if not enough digits,
// -1 means we should drop the decimal point
'decimalDigits'=>2,
// maximum number of digits after the decimal point,
// additional digits will be truncated.
'maxDecimalDigits'=>3,
// number of required digits before the decimal point,
// will be padded with 0 if not enough digits
'integerDigits'=>1,
// the primary grouping size, 0 means no grouping
'groupSize1'=>3,
// the secondary grouping size, 0 means no secondary grouping
'groupSize2'=>0,
'positivePrefix'=>'+', // prefix to positive number
'positiveSuffix'=>'', // suffix to positive number
'negativePrefix'=>'(', // prefix to negative number
'negativeSuffix'=>')', // suffix to negative number
'multiplier'=>1, // 100 for percent, 1000 for per mille
);
|
| $value | смешанный | число, которое нужно отформатировать |
| {return} | строка | результат форматирования |
protected function formatNumber($format,$value)
{
$negative=$value<0;
$value=abs($value*$format['multiplier']);
if($format['maxDecimalDigits']>=0)
$value=number_format($value,$format['maxDecimalDigits'],'.','');
$value="$value";
if(false !== $pos=strpos($value,'.'))
{
$integer=substr($value,0,$pos);
$decimal=substr($value,$pos+1);
}
else
{
$integer=$value;
$decimal='';
}
if($format['decimalDigits']>strlen($decimal))
$decimal=str_pad($decimal,$format['decimalDigits'],'0');
elseif($format['decimalDigits']<strlen($decimal))
{
$decimal_temp='';
for($i=strlen($decimal)-1;$i>=0;$i--)
if($decimal[$i]!=='0' || strlen($decimal_temp)>0)
$decimal_temp=$decimal[$i].$decimal_temp;
$decimal=$decimal_temp;
}
if(strlen($decimal)>0)
$decimal=$this->_locale->getNumberSymbol('decimal').$decimal;
$integer=str_pad($integer,$format['integerDigits'],'0',STR_PAD_LEFT);
if($format['groupSize1']>0 && strlen($integer)>$format['groupSize1'])
{
$str1=substr($integer,0,-$format['groupSize1']);
$str2=substr($integer,-$format['groupSize1']);
$size=$format['groupSize2']>0?$format['groupSize2']:$format['groupSize1'];
$str1=str_pad($str1,(int)((strlen($str1)+$size-1)/$size)*$size,' ',STR_PAD_LEFT);
$integer=ltrim(implode($this->_locale->getNumberSymbol('group'),str_split($str1,$size))).$this->_locale->getNumberSymbol('group').$str2;
}
if($negative)
$number=$format['negativePrefix'].$integer.$decimal.$format['negativeSuffix'];
else
$number=$format['positivePrefix'].$integer.$decimal.$format['positiveSuffix'];
return strtr($number,array('%'=>$this->_locale->getNumberSymbol('percentSign'),'‰'=>$this->_locale->getNumberSymbol('perMille')));
}
Форматирует число на основе формата. Этот метод выполняет фактическое форматирование числа.
formatPercentage() метод
public string formatPercentage(mixed $value) | ||
| $value | смешанный | число, которое нужно отформатировать |
| {return} | строка | результат форматирования. |
public function formatPercentage($value)
{
return $this->format($this->_locale->getPercentFormat(),$value);
}
Форматирует число в процентном формате, определённом в локали. Если процентный формат содержит '%', число предварительно умножается на 100. Если процентный формат содержит '‰', число предварительно умножается на 1000.
parseFormat() метод
protected array parseFormat(string $pattern) | ||
| $pattern | строка | шаблон для разбора |
| {return} | массив | разбор шаблона |
protected function parseFormat($pattern)
{
if(isset($this->_formats[$pattern]))
return $this->_formats[$pattern];
$format=array();
// find out prefix and suffix for positive and negative patterns
$patterns=explode(';',$pattern);
$format['positivePrefix']=$format['positiveSuffix']=$format['negativePrefix']=$format['negativeSuffix']='';
if(preg_match('/^(.*?)[#,\.0]+(.*?)$/',$patterns[0],$matches))
{
$format['positivePrefix']=$matches[1];
$format['positiveSuffix']=$matches[2];
}
if(isset($patterns[1]) && preg_match('/^(.*?)[#,\.0]+(.*?)$/',$patterns[1],$matches)) // with a negative pattern
{
$format['negativePrefix']=$matches[1];
$format['negativeSuffix']=$matches[2];
}
else
{
$format['negativePrefix']=$this->_locale->getNumberSymbol('minusSign').$format['positivePrefix'];
$format['negativeSuffix']=$format['positiveSuffix'];
}
$pat=$patterns[0];
// find out multiplier
if(strpos($pat,'%')!==false)
$format['multiplier']=100;
elseif(strpos($pat,'‰')!==false)
$format['multiplier']=1000;
else
$format['multiplier']=1;
// find out things about decimal part
if(($pos=strpos($pat,'.'))!==false)
{
if(($pos2=strrpos($pat,'0'))>$pos)
$format['decimalDigits']=$pos2-$pos;
else
$format['decimalDigits']=0;
if(($pos3=strrpos($pat,'#'))>=$pos2)
$format['maxDecimalDigits']=$pos3-$pos;
else
$format['maxDecimalDigits']=$format['decimalDigits'];
$pat=substr($pat,0,$pos);
}
else // no decimal part
{
$format['decimalDigits']=0;
$format['maxDecimalDigits']=0;
}
// find out things about integer part
$p=str_replace(',','',$pat);
if(($pos=strpos($p,'0'))!==false)
$format['integerDigits']=strrpos($p,'0')-$pos+1;
else
$format['integerDigits']=0;
// find out group sizes. some patterns may have two different group sizes
$p=str_replace('#','0',$pat);
if(($pos=strrpos($pat,','))!==false)
{
$format['groupSize1']=strrpos($p,'0')-$pos;
if(($pos2=strrpos(substr($p,0,$pos),','))!==false)
$format['groupSize2']=$pos-$pos2-1;
else
$format['groupSize2']=0;
}
else
$format['groupSize1']=$format['groupSize2']=0;
return $this->_formats[$pattern]=$format;
}
Разбирает переданный строковый шаблон.
См. также
© 2008–2017 by Yii Software LLC
Licensed under the three clause BSD license.
http://www.yiiframework.com/doc/api/1.1/CNumberFormatter