Passed
Pull Request — master (#78)
by
unknown
11:31
created

NumericHelper::toOrdinal()   B

Complexity

Conditions 7
Paths 7

Size

Total Lines 23
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 16
CRAP Score 7

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 7
eloc 16
c 2
b 0
f 0
nc 7
nop 1
dl 0
loc 23
ccs 16
cts 16
cp 1
crap 7
rs 8.8333
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\Strings;
6
7
use InvalidArgumentException;
8
use function in_array;
9
use function is_bool;
10
11
/**
12
 * Provides static methods to work with numeric strings.
13
 */
14
final class NumericHelper
15
{
16
    /**
17
     * Converts number to its ordinal English form. For example, converts 13 to 13th, 2 to 2nd etc.
18
     *
19
     * @param float|int|string $value The number to get its ordinal value.
20
     *
21
     * @return string
22
     */
23 2
    public static function toOrdinal($value): string
24
    {
25 2
        if (!is_numeric($value)) {
26 1
            $type = gettype($value);
27 1
            throw new InvalidArgumentException("Value must be numeric. $type given.");
28
        }
29
30 1
        if (fmod((float)$value, 1) !== 0.00) {
31 1
            return (string)$value;
32
        }
33
34 1
        if (in_array($value % 100, [11, 12, 13], true)) {
35 1
            return $value . 'th';
36
        }
37 1
        switch ($value % 10) {
38 1
            case 1:
39 1
                return $value . 'st';
40 1
            case 2:
41 1
                return $value . 'nd';
42 1
            case 3:
43 1
                return $value . 'rd';
44
            default:
45 1
                return $value . 'th';
46
        }
47
    }
48
49
    /**
50
     * Returns string representation of a number value without thousands separators and with dot as decimal separator.
51
     *
52
     * @param bool|float|int|string $value
53
     *
54
     * @throws InvalidArgumentException if value is not scalar.
55
     *
56
     * @return string
57
     */
58 10
    public static function normalize($value): string
59
    {
60
        /** @psalm-suppress DocblockTypeContradiction */
61 10
        if (!is_scalar($value)) {
0 ignored issues
show
introduced by
The condition is_scalar($value) is always true.
Loading history...
62 1
            $type = gettype($value);
63 1
            throw new InvalidArgumentException("Value must be scalar. $type given.");
64
        }
65
66 9
        if (is_bool($value)) {
67 2
            $value = $value ? '1' : '0';
68
        } else {
69 7
            $value = (string)$value;
70
        }
71 9
        $value = str_replace([' ', ','], ['', '.'], $value);
72 9
        return preg_replace('/\.(?=.*\.)/', '', $value);
73
    }
74
75
    /**
76
     * Checks whether the given value is an integer number.
77
     *
78
     * @param mixed $value
79
     *
80
     * @return bool
81
     */
82 9
    public static function isInteger($value): bool
83
    {
84 9
        return filter_var($value, FILTER_VALIDATE_INT) !== false;
85
    }
86
87
    /**
88
     * Checks whether the given string is a positive integer number.
89
     *
90
     * @param string $string
91
     *
92
     * @return bool
93
     */
94 7
    public static function isPositiveInteger(string $string): bool
95
    {
96
        // Exclude strings like "+5"
97 7
        if (!preg_match('/^\d+$/', $string)) {
98 5
            return false;
99
        }
100
101 2
        return filter_var($string, FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]) !== false;
102
    }
103
}
104