Вход Регистрация
Файл: 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 + (($len 1) % 3);
                
$pre substr($intPart0$preLength);
                
$intPart $pre.$groupSign.implode($groupSignstr_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;
    }
}
Онлайн: 2
Реклама