Spec-Zone.ru › Yii 1.1

CNumberFormatter

Пакет system.i18n
Наследование класс CNumberFormatter » CComponent
С версии 1.0
Исходный код framework/i18n/CNumberFormatter.php
CNumberFormatter предоставляет функциональность локализации чисел.

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
Исходный код: framework/i18n/CNumberFormatter.php#69 (показать)
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} строка результат форматирования.
Исходный код: framework/i18n/CNumberFormatter.php#90 (показать)
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} строка результат форматирования.
Исходный код: framework/i18n/CNumberFormatter.php#108 (показать)
public function formatCurrency($value,$currency)
{
    return 
$this->format($this->_locale->getCurrencyFormat(),$value,$currency);
}

Форматирует число с использованием формата валюты, определённого в локали.

formatDecimal() метод

public string formatDecimal(mixed $value)
$value смешанный число, которое нужно отформатировать
{return} строка результат форматирования.
Исходный код: framework/i18n/CNumberFormatter.php#130 (показать)
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} строка результат форматирования
Исходный код: framework/i18n/CNumberFormatter.php#165 (показать)
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} строка результат форматирования.
Исходный код: framework/i18n/CNumberFormatter.php#120 (показать)
public function formatPercentage($value)
{
    return 
$this->format($this->_locale->getPercentFormat(),$value);
}

Форматирует число в процентном формате, определённом в локали. Если процентный формат содержит '%', число предварительно умножается на 100. Если процентный формат содержит '‰', число предварительно умножается на 1000.

parseFormat() метод

protected array parseFormat(string $pattern)
$pattern строка шаблон для разбора
{return} массив разбор шаблона
Исходный код: framework/i18n/CNumberFormatter.php#219 (показать)
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;
}

Разбирает переданный строковый шаблон.

См. также

  • formatNumber

© 2008–2017 by Yii Software LLC
Licensed under the three clause BSD license.
http://www.yiiframework.com/doc/api/1.1/CNumberFormatter

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API