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

namespace Punic;

/**
 * Numbers helpers.
 */
class Number
{
    
/**
     * Check if a variable contains a valid number for the specified locale.
     *
     * @param string $value The string value to check
     * @param string $locale The locale to use. If empty we'll use the default locale set in PunicData
     *
     * @return bool
     */
    
public static function isNumeric($value, $locale = '')
    {
        return static::
unformat($value, $locale) !== null;
    }

    
/**
     * Check if a variable contains a valid integer number for the specified locale.
     *
     * @param string $value The string value to check
     * @param string $locale The locale to use. If empty we'll use the default locale set in PunicData
     *
     * @return bool
     */
    
public static function isInteger($value, $locale = '')
    {
        
$result = false;
        
$number = static::unformat($value, $locale);
        if (
is_int($number)) {
            
$result = true;
        } elseif (
is_float($number)) {
            if (
$number === floatval(round($number))) {
                
$result = true;
            }
        }

        return 
$result;
    }

    
/**
     * Localize a number representation (for instance, converts 1234.5 to '1,234.5' in case of English and to '1.234,5' in case of Italian).
     *
     * @param numeric $value The string value to convert
     * @param int|null $precision The wanted precision (well use {@link http://php.net/manual/function.round.php})
     * @param string $locale The locale to use. If empty we'll use the default locale set in PunicData
     *
     * @return string Returns an empty string $value is not a number, otherwise returns the localized representation of the number
     */
    
public static function format($value, $precision = null, $locale = '')
    {
        
$result = '';
        
$number = null;
        if (
is_int($value) || is_float($value)) {
            
$number = $value;
        } elseif (
is_string($value) && isset($value[0])) {
            if (
preg_match('/^[\-+]?\d+$/', $value)) {
                
$number = intval($value);
            } elseif (
preg_match('/^[\-+]?(\d*)\.(\d*)$/', $value, $m)) {
                if (!isset(
$m[1])) {
                    
$m[1] = '';
                }
                if (!isset(
$m[2])) {
                    
$m[2] = '';
                }
                if ((isset(
$m[1][0])) || (isset($m[2][0]))) {
                    
$number = floatval($value);
                    if (!
is_numeric($precision)) {
                        
$precision = strlen($m[2]);
                    }
                }
            }
        }
        if (
$number !== null) {
            
$precision = is_numeric($precision) ? intval($precision) : null;
            if (
$precision !== null) {
                
$value = round($value, $precision);
            }
            
$data = Data::get('numbers', $locale);
            
$decimal = $data['symbols']['decimal'];
            
$groupLength = (isset($data['groupLength']) && is_numeric($data['groupLength'])) ? intval($data['groupLength']) : 3;
            if (
$value < 0) {
                
$sign = $data['symbols']['minusSign'];
                
$value = abs($value);
            } else {
                
$sign = '';
            }
            
$full = explode('.', strval($value), 2);
            
$intPart = $full[0];
            
$floatPath = (count($full) > 1) ? $full[1] : '';
            
$len = strlen($intPart);
            if ((
$groupLength > 0) && ($len > $groupLength)) {
                
$groupSign = $data['symbols']['group'];
                
$preLength = 1 + (($len - 1) % 3);
                
$pre = substr($intPart, 0, $preLength);
                
$intPart = $pre.$groupSign.implode($groupSign, str_split(substr($intPart, $preLength), $groupLength));
            }
            
$result = $sign.$intPart;
            if (
$precision === null) {
                if (isset(
$floatPath[0])) {
                    
$result .= $decimal.$floatPath;
                }
            } elseif (
$precision > 0) {
                
$result .= $decimal.substr(str_pad($floatPath, $precision, '0', STR_PAD_RIGHT), 0, $precision);
            }
        }

        return 
$result;
    }

    
/**
     * Convert a localized representation of a number to a number (for instance, converts the string '1,234' to 1234 in case of English and to 1.234 in case of Italian).
     *
     * @param string $value The string value to convert
     * @param string $locale The locale to use. If empty we'll use the default locale set in PunicData
     *
     * @return int|float|null Returns null if $value is not valid, the numeric value otherwise
     */
    
public static function unformat($value, $locale = '')
    {
        
$result = null;
        if (
is_int($value) || is_float($value)) {
            
$result = $value;
        } elseif (
is_string($value) && isset($value[0])) {
            
$data = Data::get('numbers', $locale);
            
$plus = $data['symbols']['plusSign'];
            
$plusQ = preg_quote($plus);
            
$minus = $data['symbols']['minusSign'];
            
$minusQ = preg_quote($minus);
            
$decimal = $data['symbols']['decimal'];
            
$decimalQ = preg_quote($decimal);
            
$group = $data['symbols']['group'];
            
$groupQ = preg_quote($group);
            
$ok = true;
            if (
preg_match('/^'."($plusQ|$minusQ)?(\d+(?:$groupQ\d+)*)".'$/', $value, $m)) {
                
$sign = $m[1];
                
$int = $m[2];
                
$float = null;
            } elseif (
preg_match('/^'."($plusQ|$minusQ)?(\d+(?:$groupQ\d+)*)$decimalQ".'$/', $value, $m)) {
                
$sign = $m[1];
                
$int = $m[2];
                
$float = '';
            } elseif (
preg_match('/^'."($plusQ|$minusQ)?(\d+(?:$groupQ\d+)*)$decimalQ(\d+)".'$/', $value, $m)) {
                
$sign = $m[1];
                
$int = $m[2];
                
$float = $m[3];
            } elseif (
preg_match('/^'."($plusQ|$minusQ)?$decimalQ(\d+)".'$/', $value, $m)) {
                
$sign = $m[1];
                
$int = '0';
                
$float = $m[2];
            } else {
                
$ok = false;
                
$float = $int = $sign = null;
            }
            if (
$ok) {
                if (
$sign === $minus) {
                    
$sign = '-';
                } else {
                    
$sign = '';
                }
                
$int = str_replace($group, '', $int);
                if (
$float === null) {
                    
$result = intval("$sign$int");
                } else {
                    
$result = floatval("$sign$int.$float");
                }
            }
        }

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