Вход Регистрация
Файл: concrete5.7.5.6/concrete/vendor/punic/punic/code/Unit.php
Строк: 219
<?php

namespace Punic;

/**
 * Units helper stuff.
 */
class Unit
{
    
/**
     * Format a unit string.
     *
     * @param int|float|string $number The unit amount
     * @param string $unit The unit identifier (eg 'duration/millisecond' or 'millisecond')
     * @param string $width The format name; it can be 'long' (eg '3 milliseconds'), 'short' (eg '3 ms') or 'narrow' (eg '3ms'). You can also add a precision specifier ('long,2' or just '2')
     * @param string $locale The locale to use. If empty we'll use the default locale set in PunicData
     *
     * @return string
     *
     * @throws ExceptionValueNotInList
     */
    
public static function format($number$unit$width 'short'$locale '')
    {
        
$data Data::get('units'$locale);
        
$precision null;
        if (
is_int($width)) {
            
$precision $width;
            
$width 'short';
        } elseif (
is_string($width) && preg_match('/^(?:(.*),)?([+\-]?\d+)$/'$width$m)) {
            
$precision intval($m[2]);
            
$width $m[1];
            if (!isset(
$width[0])) {
                
$width 'short';
            }
        }
        if ((
strpos($width'_') === 0) || (!isset($data[$width]))) {
            
$widths = array();
            foreach (
array_keys($data) as $w) {
                if (
strpos($w'_') !== 0) {
                    
$widths[] = $w;
                }
            }
            throw new 
ExceptionValueNotInList($width$widths);
        }
        
$data $data[$width];
        if (
strpos($unit'/') === false) {
            
$unitCategory null;
            
$unitID null;
            foreach (
array_keys($data) as $c) {
                if (
strpos($c'_') === false) {
                    if (isset(
$data[$c][$unit])) {
                        if (
$unitCategory === null) {
                            
$unitCategory $c;
                            
$unitID $unit;
                        } else {
                            
$unitCategory null;
                            break;
                        }
                    }
                }
            }
        } else {
            list(
$unitCategory$unitID) = explode('/'$unit2);
        }
        
$rules null;
        if ((
strpos($unit'_') === false) && ($unitCategory !== null) && ($unitID !== null) && isset($data[$unitCategory]) && array_key_exists($unitID$data[$unitCategory])) {
            
$rules $data[$unitCategory][$unitID];
        }
        if (
$rules === null) {
            
$units = array();
            foreach (
$data as $c => $us) {
                if (
strpos($c'_') === false) {
                    foreach (
array_keys($us) as $u) {
                        if (
strpos($c'_') === false) {
                            
$units[] = "$c/$u";
                        }
                    }
                }
            }
            throw new 
PunicExceptionValueNotInList($unit$units);
        }
        
$pluralRule Plural::getRule($number$locale);
        
//@codeCoverageIgnoreStart
        // These checks aren't necessary since $pluralRule should always be in $rules, but they don't hurt ;)
        
if (!isset($rules[$pluralRule])) {
            if (isset(
$rules['other'])) {
                
$pluralRule 'other';
            } else {
                
$availableRules array_keys($rules);
                
$pluralRule $availableRules[0];
            }
        }
        
//@codeCoverageIgnoreEnd
        
return sprintf($rules[$pluralRule], Number::format($number$precision$locale));
    }

    
/**
     * Retrieve the measurement systems and their localized names.
     *
     * @param string $locale The locale to use. If empty we'll use the default locale set in PunicData
     *
     * @return array The array keys are the measurement system codes (eg 'metric', 'US', 'UK'), the values are the localized measurement system names (eg 'Metric', 'US', 'UK' for English)
     */
    
public static function getMeasurementSystems($locale '')
    {
        return 
Data::get('measurementSystemNames'$locale);
    }

    
/**
     * Retrieve the measurement system for a specific territory.
     *
     * @param string $territoryCode The territory code (eg. 'US' for 'United States of America').
     *
     * @return string Return the measurement system code (eg: 'metric') for the specified territory. If $territoryCode is not valid we'll return an empty string.
     */
    
public static function getMeasurementSystemFor($territoryCode)
    {
        
$result '';
        if (
is_string($territoryCode) && preg_match('/^[a-z0-9]{2,3}$/i'$territoryCode)) {
            
$territoryCode strtoupper($territoryCode);
            
$data Data::getGeneric('measurementData');
            while (isset(
$territoryCode[0])) {
                if (isset(
$data['measurementSystem'][$territoryCode])) {
                    
$result $data['measurementSystem'][$territoryCode];
                    break;
                }
                
$territoryCode Territory::getParentTerritoryCode($territoryCode);
            }
        }

        return 
$result;
    }

    
/**
     * Returns the list of countries that use a specific measurement system.
     *
     * @param string $measurementSystem The measurement system identifier ('metric', 'US' or 'UK')
     *
     * @return array The list of country IDs that use the specified measurement system (if $measurementSystem is invalid you'll get an empty array)
     */
    
public static function getCountriesWithMeasurementSystem($measurementSystem)
    {
        
$result = array();
        if (
is_string($measurementSystem) && (isset($measurementSystem[0]))) {
            
$someGroup false;
            
$data Data::getGeneric('measurementData');
            foreach (
$data['measurementSystem'] as $territory => $ms) {
                if (
strcasecmp($measurementSystem$ms) === 0) {
                    
$children Territory::getChildTerritoryCodes($territorytrue);
                    if (empty(
$children)) {
                        
$result[] = $territory;
                    } else {
                        
$someGroup true;
                        
$result array_merge($result$children);
                    }
                }
            }
            if (
$someGroup) {
                
$otherCountries = array();
                foreach (
$data['measurementSystem'] as $territory => $ms) {
                    if ((
$territory !== '001') && (strcasecmp($measurementSystem$ms) !== 0)) {
                        
$children Territory::getChildTerritoryCodes($territorytrue);
                        if (empty(
$children)) {
                            
$otherCountries[] = $territory;
                        } else {
                            
$otherCountries array_merge($otherCountries$children);
                        }
                    }
                }
                
$result array_values(array_diff($result$otherCountries));
            }
        }

        return 
$result;
    }

    
/**
     * Retrieve the standard paper size for a specific territory.
     *
     * @param string $territoryCode The territory code (eg. 'US' for 'United States of America').
     *
     * @return string Return the standard paper size (eg: 'A4' or 'US-Letter') for the specified territory. If $territoryCode is not valid we'll return an empty string.
     */
    
public static function getPaperSizeFor($territoryCode)
    {
        
$result '';
        if (
is_string($territoryCode) && preg_match('/^[a-z0-9]{2,3}$/i'$territoryCode)) {
            
$territoryCode strtoupper($territoryCode);
            
$data Data::getGeneric('measurementData');
            while (isset(
$territoryCode[0])) {
                if (isset(
$data['paperSize'][$territoryCode])) {
                    
$result $data['paperSize'][$territoryCode];
                    break;
                }
                
$territoryCode Territory::getParentTerritoryCode($territoryCode);
            }
        }

        return 
$result;
    }

    
/**
     * Returns the list of countries that use a specific paper size by default.
     *
     * @param string $paperSize The paper size identifier ('A4' or 'US-Letter')
     *
     * @return array The list of country IDs that use the specified paper size (if $paperSize is invalid you'll get an empty array)
     */
    
public static function getCountriesWithPaperSize($paperSize)
    {
        
$result = array();
        if (
is_string($paperSize) && (isset($paperSize[0]))) {
            
$someGroup false;
            
$data Data::getGeneric('measurementData');
            foreach (
$data['paperSize'] as $territory => $ms) {
                if (
strcasecmp($paperSize$ms) === 0) {
                    
$children Territory::getChildTerritoryCodes($territorytrue);
                    if (empty(
$children)) {
                        
$result[] = $territory;
                    } else {
                        
$someGroup true;
                        
$result array_merge($result$children);
                    }
                }
            }
            if (
$someGroup) {
                
$otherCountries = array();
                foreach (
$data['paperSize'] as $territory => $ms) {
                    if ((
$territory !== '001') && (strcasecmp($paperSize$ms) !== 0)) {
                        
$children Territory::getChildTerritoryCodes($territorytrue);
                        if (empty(
$children)) {
                            
$otherCountries[] = $territory;
                        } else {
                            
$otherCountries array_merge($otherCountries$children);
                        }
                    }
                }
                
$result array_values(array_diff($result$otherCountries));
            }
        }

        return 
$result;
    }
}
Онлайн: 2
Реклама