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.
Passed
Pull Request — master (#28)
by t
08:50
created

Numbers::isOdd()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

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