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