Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

NumberFormat.php 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. <?php
  2. namespace App\Enums;
  3. use Filament\Support\Contracts\HasLabel;
  4. use NumberFormatter;
  5. enum NumberFormat: string implements HasLabel
  6. {
  7. case CommaDot = 'comma_dot';
  8. case DotComma = 'dot_comma';
  9. case IndianGrouping = 'indian_grouping';
  10. case ApostropheDot = 'apostrophe_dot';
  11. case SpaceComma = 'space_comma';
  12. case SpaceDot = 'space_dot';
  13. public const DEFAULT = self::CommaDot->value;
  14. public function getLabel(): ?string
  15. {
  16. return match ($this) {
  17. self::CommaDot => '#,###,###.##',
  18. self::DotComma => '#.###.###,##',
  19. self::IndianGrouping => '#,##,###.##',
  20. self::ApostropheDot => '#\'###\'###.##',
  21. self::SpaceComma => '# ### ###,##',
  22. self::SpaceDot => '# ### ###.##',
  23. };
  24. }
  25. public function getDecimalMark(): string
  26. {
  27. return match ($this) {
  28. self::CommaDot, self::SpaceDot, self::IndianGrouping, self::ApostropheDot => '.',
  29. self::DotComma, self::SpaceComma => ',',
  30. };
  31. }
  32. public function getThousandsSeparator(): string
  33. {
  34. return match ($this) {
  35. self::CommaDot, self::IndianGrouping => ',',
  36. self::DotComma => '.',
  37. self::SpaceComma, self::SpaceDot => ' ',
  38. self::ApostropheDot => '\'',
  39. };
  40. }
  41. public function getFormattedExample(): string
  42. {
  43. $exampleNumber = 1234567.89;
  44. $formatter = new NumberFormatter($this->getAssociatedLocale(), NumberFormatter::DECIMAL);
  45. return $formatter->format($exampleNumber);
  46. }
  47. public function getAssociatedLocale(): string
  48. {
  49. return match ($this) {
  50. self::CommaDot => 'en_US',
  51. self::DotComma => 'de_DE',
  52. self::IndianGrouping => 'en_IN',
  53. self::ApostropheDot => 'fr_FR',
  54. self::SpaceComma => 'fr_CH',
  55. self::SpaceDot => 'xh_ZA',
  56. };
  57. }
  58. public static function fromLanguageAndCountry(string $language, string $countryCode): string
  59. {
  60. $testNumber = 1234567.8912;
  61. $fullLocale = "{$language}_{$countryCode}";
  62. $numberFormatter = new NumberFormatter($fullLocale, NumberFormatter::DECIMAL);
  63. $formattedNumber = $numberFormatter->format($testNumber);
  64. return self::fromFormattedNumber($formattedNumber);
  65. }
  66. public static function fromFormattedNumber(string $formattedNumber): string
  67. {
  68. $commaDot = strpos($formattedNumber, '.') && strpos($formattedNumber, ',');
  69. $dotComma = strpos($formattedNumber, ',') && strpos($formattedNumber, '.');
  70. $indianGrouping = strpos($formattedNumber, ',') && ! strpos($formattedNumber, '.');
  71. $apostropheDot = strpos($formattedNumber, '\'') && strpos($formattedNumber, '.');
  72. $spaceComma = strpos($formattedNumber, ' ') && strpos($formattedNumber, ',');
  73. $spaceDot = strpos($formattedNumber, ' ') && strpos($formattedNumber, '.');
  74. return match (true) {
  75. $commaDot => self::CommaDot->value,
  76. $dotComma => self::DotComma->value,
  77. $indianGrouping => self::IndianGrouping->value,
  78. $apostropheDot => self::ApostropheDot->value,
  79. $spaceComma => self::SpaceComma->value,
  80. $spaceDot => self::SpaceDot->value,
  81. default => self::DEFAULT,
  82. };
  83. }
  84. public function getFormattingParameters(): array
  85. {
  86. return [$this->getDecimalMark(), $this->getThousandsSeparator()];
  87. }
  88. }