GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Pull Request — master (#18)
by t
04:52 queued 01:14
created

Numbers::base()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 4
c 1
b 0
f 0
nc 1
nop 3
dl 0
loc 6
ccs 0
cts 5
cp 0
crap 2
rs 10
1
<?php
2
/**
3
 * Class Numbers
4
 *
5
 * @link https://www.icy2003.com/
6
 * @author icy2003 <[email protected]>
7
 * @copyright Copyright (c) 2017, icy2003
8
 */
9
namespace icy2003\php\ihelpers;
10
11
use icy2003\php\C;
12
use icy2003\php\I;
13
14
/**
15
 * 数字处理
16
 */
17
class Numbers
18
{
19
    /**
20
     * 比较两个任意精度的数字
21
     *
22
     * - 修复 bccomp 无法正确比较 0.999999 和 1 的值!!!!
23
     *
24
     * @param string $number1 数字1
25
     * @param string $number2 数字2
26
     * @param integer $scale 精确度,默认精确到小数点后 2 位
27
     *
28
     * @return boolean
29
     */
30 16
    public static function isEquals($number1, $number2, $scale = 2)
31
    {
32 16
        return 0 === bccomp($number1 - $number2, 0, $scale);
33
    }
34
35
    /**
36
     * 加载一些奇怪的常量
37
     *
38
     * 我知道这些符号不好打,所以从注释里复制喽
39
     *
40
     * @constant double π 圆周率
41
     * @constant double e 自然常数
42
     * @constant double γ 欧拉常数
43
     * @constant double φ 黄金比
44
     * @constant double c 光速
45
     *
46
     * @return void
47
     */
48
    public static function load()
49
    {
50
        I::def('π', M_PI);
51
        I::def('e', M_E);
52
        I::def('γ', M_EULER);
53
        I::def('φ', (sqrt(5) - 1) / 2);
54
        I::def('c', 2.99792458e8);
55
    }
56
57
    /**
58
     * 获取数字在指定长度的位置
59
     *
60
     * @param integer $number
61
     * @param integer $length
62
     *
63
     * @return integer
64
     */
65
    public static function position($number, $length)
66
    {
67
        while ($number < 0) {
68
            $number += $length;
69
        }
70
        return $number % $length;
71
    }
72
73
    /**
74
     * 转成字节数
75
     *
76
     * - 支持数字和单位之间有空格
77
     *
78
     * @param string $size 例如:10m、10M、10Tb、10kB 等
79
     *
80
     * @return integer
81
     */
82
    public static function toBytes($size)
83
    {
84
        $callback = function ($matches) {
85
            $sizeMap = [
86
                '' => 0,
87
                'b' => 0, // 为了简化正则
88
                'k' => 1,
89
                'm' => 2,
90
                'g' => 3,
91
                't' => 4,
92
                'p' => 5,
93
            ];
94
95
            return $matches[1] * pow(1024, $sizeMap[strtolower($matches[2])]);
96
        };
97
98
        return (int) preg_replace_callback('/(\d*)\s*([a-z]?)b?/i', $callback, $size, 1);
99
    }
100
101
    /**
102
     * 字节数尽可能转成 k、m、g 等形式
103
     *
104
     * - 支持小单位转大单位
105
     *
106
     * @param integer $bytes
107
     *
108
     * @return string
109
     */
110
    public static function fromBytes($bytes)
111
    {
112
        $bytes = self::toBytes($bytes);
113
        $unit = array('b', 'kb', 'mb', 'gb', 'tb', 'pb');
114
        return @round($bytes / pow(1024, ($i = floor(log($bytes, 1024)))), 2) . ' ' . $unit[$i];
115
    }
116
117
    /**
118
     * 比较两个值(如:10m、10M、10Tb、10kB 等)的大小
119
     *
120
     * - 0:相等,-1:左小于右,1:右小于左
121
     *
122
     * @param string $size1
123
     * @param string $size2
124
     *
125
     * @return integer
126
     */
127
    public static function compareSize($size1, $size2)
128
    {
129
        $bytes1 = self::toBytes($size1);
130
        $bytes2 = self::toBytes($size2);
131
        return bccomp($bytes1, $bytes2, 0);
132
    }
133
134
    /**
135
     * 将某进制的字符串转化成另一进制的字符串
136
     *
137
     * @see http://php.net/manual/zh/function.base-convert.php
138
     *
139
     * @param string $numberInput 待转换的字符串
140
     * @param string $fromBaseInput 起始进制的规则
141
     * @param string $toBaseInput 结束进制的规则
142
     *
143
     * @return string
144
     */
145
    public static function baseConvert($numberInput, $fromBaseInput, $toBaseInput)
146
    {
147
        if ($fromBaseInput == $toBaseInput) {
148
            return $numberInput;
149
        }
150
151
        $fromBase = Strings::split($fromBaseInput);
152
        $toBase = Strings::split($toBaseInput);
153
        $number = Strings::split($numberInput);
154
        $fromLen = Strings::length($fromBaseInput);
155
        $toLen = Strings::length($toBaseInput);
156
        $numberLen = Strings::length($numberInput);
157
        $retval = '';
158
        if ($toBaseInput == '0123456789') {
159
            $retval = 0;
160
            for ($i = 1; $i <= $numberLen; $i++) {
161
                $retval = bcadd($retval, bcmul((string) array_search($number[$i - 1], $fromBase), bcpow($fromLen, $numberLen - $i)));
162
            }
163
164
            return $retval;
165
        }
166
        if ($fromBaseInput != '0123456789') {
167
            $base10 = self::baseConvert($numberInput, $fromBaseInput, '0123456789');
168
        } else {
169
            $base10 = $numberInput;
170
        }
171
172
        if ($base10 < Strings::length($toBaseInput)) {
173
            return $toBase[$base10];
174
        }
175
176
        while ($base10 != '0') {
177
            $retval = $toBase[bcmod($base10, $toLen)] . $retval;
178
            $base10 = bcdiv($base10, $toLen, 0);
179
        }
180
        return $retval;
181
    }
182
183
    /**
184
     * 进制转换
185
     *
186
     * - 支持 2、8、10、16 进制之间转换
187
     *
188
     * @param string $number
189
     * @param integer $fromBase 2、8、10、16之间互转
190
     * @param integer $toBase 2、8、10、16之间互转
191
     *
192
     * @return string
193
     */
194
    public static function base($number, $fromBase, $toBase)
195
    {
196
        C::assertTrue(in_array($fromBase, [2, 8, 10, 16]), '原始进制必须为 2、8、10、16 之一');
197
        C::assertTrue(in_array($toBase, [2, 8, 10, 16]), '目标进制必须为 2、8、10、16 之一');
198
        $chars = '0123456789ABCDEF';
199
        return self::baseConvert($number, Strings::sub($chars, 0, $fromBase), Strings::sub($chars, 0, $toBase));
200
    }
201
202
    /**
203
     * 中文大写数字转成小写数字
204
     *
205
     * @param string $number
206
     *
207
     * @return string
208
     */
209
    public static function toLowerChineseCase($number)
210
    {
211
        return Strings::replace($number, [
212
            '零' => '〇',
213
            '壹' => '一',
214
            '贰' => '二',
215
            '叁' => '三',
216
            '肆' => '四',
217
            '伍' => '五',
218
            '陆' => '六',
219
            '柒' => '七',
220
            '捌' => '八',
221
            '玖' => '九',
222
            '拾' => '十',
223
            '佰' => '百',
224
            '仟' => '千',
225
            '圆' => '元',
226
        ]);
227
    }
228
229
    /**
230
     * 中文小写数字转成大写数字
231
     *
232
     * @param string $number
233
     *
234
     * @return string
235
     */
236
    public static function toUpperChineseCase($number)
237
    {
238
        return Strings::replace($number, [
239
            '〇' => '零',
240
            '一' => '壹',
241
            '二' => '贰',
242
            '三' => '叁',
243
            '四' => '肆',
244
            '五' => '伍',
245
            '六' => '陆',
246
            '七' => '柒',
247
            '八' => '捌',
248
            '九' => '玖',
249
            '十' => '拾',
250
            '百' => '佰',
251
            '千' => '仟',
252
            '元' => '圆',
253
        ]);
254
    }
255
}
256