1441 |
ariadna |
1 |
<?php
|
|
|
2 |
|
|
|
3 |
namespace PhpOffice\PhpSpreadsheet\Style\NumberFormat\Wizard;
|
|
|
4 |
|
|
|
5 |
use NumberFormatter;
|
|
|
6 |
use PhpOffice\PhpSpreadsheet\Exception;
|
|
|
7 |
|
|
|
8 |
final class Locale
|
|
|
9 |
{
|
|
|
10 |
/**
|
|
|
11 |
* Language code: ISO-639 2 character, alpha.
|
|
|
12 |
* Optional script code: ISO-15924 4 alpha.
|
|
|
13 |
* Optional country code: ISO-3166-1, 2 character alpha.
|
|
|
14 |
* Separated by underscores or dashes.
|
|
|
15 |
*/
|
|
|
16 |
public const STRUCTURE = '/^(?P<language>[a-z]{2})([-_](?P<script>[a-z]{4}))?([-_](?P<country>[a-z]{2}))?$/i';
|
|
|
17 |
|
|
|
18 |
private NumberFormatter $formatter;
|
|
|
19 |
|
|
|
20 |
public function __construct(?string $locale, int $style)
|
|
|
21 |
{
|
|
|
22 |
if (class_exists(NumberFormatter::class) === false) {
|
|
|
23 |
throw new Exception();
|
|
|
24 |
}
|
|
|
25 |
|
|
|
26 |
$formatterLocale = str_replace('-', '_', $locale ?? '');
|
|
|
27 |
$this->formatter = new NumberFormatter($formatterLocale, $style);
|
|
|
28 |
if ($this->formatter->getLocale() !== $formatterLocale) {
|
|
|
29 |
throw new Exception("Unable to read locale data for '{$locale}'");
|
|
|
30 |
}
|
|
|
31 |
}
|
|
|
32 |
|
|
|
33 |
public function format(bool $stripRlm = true): string
|
|
|
34 |
{
|
|
|
35 |
$str = $this->formatter->getPattern();
|
|
|
36 |
|
|
|
37 |
return ($stripRlm && str_starts_with($str, "\xe2\x80\x8f")) ? substr($str, 3) : $str;
|
|
|
38 |
}
|
|
|
39 |
}
|