Issues (662)

src/Numbers/NumberFormatter.php (1 issue)

1
<?php
2
3
namespace ICanBoogie\CLDR\Numbers;
4
5
use ICanBoogie\CLDR\Core\Formatter;
6
use ICanBoogie\CLDR\Core\Locale;
7
use ICanBoogie\CLDR\Core\Localizable;
8
9
/**
10
 * A number formatter.
11
 *
12
 * @implements Localizable<NumberFormatter, NumberFormatterLocalized>
13
 */
14
final class NumberFormatter implements Formatter, Localizable
15
{
16
    /**
17
     * Formats a number with the specified pattern.
18
     *
19
     * Note, if the pattern contains '%', the number will be multiplied by 100 first. If the
20
     * pattern contains '‰', the number will be multiplied by 1000.
21
     *
22
     * @param float|int|numeric-string $number
0 ignored issues
show
Documentation Bug introduced by
The doc comment float|int|numeric-string at position 4 could not be parsed: Unknown type name 'numeric-string' at position 4 in float|int|numeric-string.
Loading history...
23
     *     The number to format.
24
     * @param string|NumberPattern $pattern
25
     *     The pattern used to format the number.
26
     */
27
    public function format(
28
        float|int|string $number,
29
        NumberPattern|string $pattern,
30
        ?Symbols $symbols = null,
31
    ): string {
32
        if (!$pattern instanceof NumberPattern) {
33
            $pattern = NumberPattern::from($pattern);
34
        }
35
36
        $symbols = $symbols ?? Symbols::defaults();
37
38
        [ $integer, $decimal ] = $pattern->parse_number($number);
39
40
        $formatted_integer = $pattern->format_integer_with_group($integer, $symbols->group);
41
        $formatted_number = $pattern->format_integer_with_decimal($formatted_integer, $decimal, $symbols->decimal);
42
43
        if ($number < 0) {
44
            $number = $pattern->negative_prefix . $formatted_number . $pattern->negative_suffix;
45
        } else {
46
            $number = $pattern->positive_prefix . $formatted_number . $pattern->positive_suffix;
47
        }
48
49
        return strtr($number, [
50
51
            '%' => $symbols->percentSign,
52
            '‰' => $symbols->perMille,
53
54
        ]);
55
    }
56
57
    public function localized(Locale $locale): NumberFormatterLocalized
58
    {
59
        return new NumberFormatterLocalized($this, $locale);
60
    }
61
}
62