Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
22 / 22
100.00% covered (success)
100.00%
6 / 6
CRAP
100.00% covered (success)
100.00%
1 / 1
Num
100.00% covered (success)
100.00%
22 / 22
100.00% covered (success)
100.00%
6 / 6
16
100.00% covered (success)
100.00%
1 / 1
 float
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 currency
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 percentage
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 convertPercentage
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 abbreviate
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
1 / 1
6
 readable
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
1 / 1
6
1<?php
2declare(strict_types=1);
3/**
4 * Pop PHP Framework (https://www.popphp.org/)
5 *
6 * @link       https://github.com/popphp/popphp-framework
7 * @author     Nick Sagona, III <nick@popphp.org>
8 * @copyright  Copyright (c) 2009-2026 Nick Sagona, III
9 * @license    https://www.popphp.org/license     New BSD License
10 */
11
12/**
13 * @namespace
14 */
15namespace Pop\Utils;
16
17/**
18 * Pop utils number helper class
19 *
20 * @category   Pop
21 * @package    Pop\Utils
22 * @author     Nick Sagona, III <nick@popphp.org>
23 * @copyright  Copyright (c) 2009-2026 Nick Sagona, III
24 * @license    https://www.popphp.org/license     New BSD License
25 * @version    3.0.0
26 */
27class Num
28{
29
30    /**
31     * Return a formatted float
32     *
33     * @param  mixed  $number
34     * @param  string $separator
35     * @param  string $decimal
36     * @param  int    $precision
37     * @return string
38     */
39    public static function float(mixed $number, string $separator = '', string $decimal = '.', int $precision = 2): string
40    {
41        return number_format((float)$number, $precision, $decimal, $separator);
42    }
43
44    /**
45     * Return a currency-formatted string
46     *
47     * @param  mixed  $number
48     * @param  string $currency
49     * @param  string $separator
50     * @param  string $decimal
51     * @param  int    $precision
52     * @return string
53     */
54    public static function currency(
55        mixed $number, string $currency = '$', string $separator = ',', string $decimal = '.', int $precision = 2
56    ): string
57    {
58        return $currency . number_format((float)$number, $precision, $decimal, $separator);
59    }
60
61    /**
62     * Return a percentage-formatted string
63     *
64     * @param  mixed  $number
65     * @param  int    $precision
66     * @param  string $decimal
67     * @return string
68     */
69    public static function percentage(mixed $number, int $precision = 2, string $decimal = '.'): string
70    {
71        return number_format((float)$number, $precision, $decimal, '') . '%';
72    }
73
74    /**
75     * Convert a numeric float to a percentage-formatted string
76     *
77     * @param  mixed  $number
78     * @param  int    $precision
79     * @param  string $decimal
80     * @return string
81     */
82    public static function convertPercentage(mixed $number, int $precision = 2, string $decimal = '.'): string
83    {
84        return self::percentage(((float)$number * 100), $precision, $decimal);
85    }
86
87    /**
88     * Abbreviate number
89     *
90     * @param  mixed  $number
91     * @param  int    $precision
92     * @param  bool   $uppercase
93     * @param  string $space
94     * @return string
95     */
96    public static function abbreviate(mixed $number, int $precision = 2, bool $uppercase = true, string $space = ''): string
97    {
98        $unit = '';
99
100        if ($number >= 1000000) {
101            $unit     = ($uppercase) ? 'M' : 'm';
102            $formatted = round($number / 1000000, $precision);
103        } else if (($number < 1000000) && ($number >= 1000)) {
104            $unit     = ($uppercase) ? 'K' : 'k';
105            $formatted = round($number / 1000, $precision);
106        } else {
107            $formatted = $number;
108        }
109
110        return $formatted . $space . $unit;
111    }
112
113    /**
114     * Format number to human-readable value
115     *
116     * @param  mixed $number
117     * @param  bool  $case
118     * @return string
119     */
120    public static function readable(mixed $number,  bool $case = true): string
121    {
122        $unit = '';
123
124        if ($number >= 1000000) {
125            $unit    = ($case) ? ' Million' : ' million';
126            $formatted = round($number / 1000000);
127        } else if (($number < 1000000) && ($number >= 1000)) {
128            $unit    = ($case) ? ' Thousand' : ' thousand';
129            $formatted = round($number / 1000);
130        } else {
131            $formatted = $number;
132        }
133
134        return $formatted . $unit;
135    }
136
137}