0 follower

CChoiceFormat

Package system.i18n
Inheritance class CChoiceFormat
Source Code framework/i18n/CChoiceFormat.php
CChoiceFormat is a helper that chooses an appropriate message based on the specified number value. The candidate messages are given as a string in the following format:
'expr1#message1|expr2#message2|expr3#message3'
where each expression should be a valid PHP expression with 'n' as the only variable. For example, 'n==1' and 'n%10==2 && n>10' are both valid expressions. The variable 'n' will take the given number value, and if an expression evaluates true, the corresponding message will be returned.

For example, given the candidate messages 'n==1#one|n==2#two|n>2#others' and the number value 2, the resulting message will be 'two'.

For expressions like 'n==1', we can also use a shortcut '1'. So the above example candidate messages can be simplified as '1#one|2#two|n>2#others'.

In case the given number doesn't select any message, the last candidate message will be returned.

The PHP expressions will be evaluated using evaluate.

Public Methods

Hide inherited methods

MethodDescriptionDefined By
format() Formats a message according to the specified number value. CChoiceFormat

Protected Methods

Hide inherited methods

MethodDescriptionDefined By
evaluate() Evaluates a PHP expression with the given number value. CChoiceFormat

Method Details

evaluate() method
protected static boolean evaluate(string $expression, mixed $n)
$expression string the PHP expression
$n mixed the number value
{return} boolean the expression result
Source Code: framework/i18n/CChoiceFormat.php#72 (show)
protected static function evaluate($expression,$n)
{
    try
    {
        return @eval(
"return $expression;");
    }
    catch (
ParseError $e)
    {
        return 
false;
    }
}

Evaluates a PHP expression with the given number value.

format() method
public static string format(string $messages, mixed $number)
$messages string the candidate messages in the format of 'expr1#message1|expr2#message2|expr3#message3'. See CChoiceFormat for more details.
$number mixed the number value
{return} string the selected message
Source Code: framework/i18n/CChoiceFormat.php#46 (show)
public static function format($messages$number)
{
    
$n=preg_match_all('/\s*([^#]*)\s*#([^\|]*)\|/',$messages.'|',$matches);
    if(
$n===0)
        return 
$messages;
    for(
$i=0;$i<$n;++$i)
    {
        
$expression=$matches[1][$i];
        
$message=$matches[2][$i];
        if(
$expression===(string)(int)$expression)
        {
            if(
$expression==$number)
                return 
$message;
        }
        elseif(
self::evaluate(str_replace('n','$n',$expression),$number))
            return 
$message;
    }
    return 
$message// return the last choice
}

Formats a message according to the specified number value.