Вход Регистрация
Файл: 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('/', $unit, 2);
        }
        
$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($territory, true);
                    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($territory, true);
                        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($territory, true);
                    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($territory, true);
                        if (empty(
$children)) {
                            
$otherCountries[] = $territory;
                        } else {
                            
$otherCountries = array_merge($otherCountries, $children);
                        }
                    }
                }
                
$result = array_values(array_diff($result, $otherCountries));
            }
        }

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