├── src ├── Contracts │ ├── CurrencyError.php │ ├── CurrencyFactory.php │ ├── MoneyFactoriesLocator.php │ ├── MoneyFactory.php │ ├── Currency.php │ ├── MoneyFormat.php │ └── Money.php ├── Errors │ ├── InvalidCurrenciesDataError.php │ ├── UnsupportedCurrencyISOCodeError.php │ └── InconsistentCurrenciesError.php ├── MoneyFactory.php ├── MoneyFactoriesLocator.php ├── Currency.php ├── MoneyFormat.php ├── CurrencyFactory.php ├── Money.php └── Data │ └── CurrencyTypes.php ├── Dockerfile ├── .mailmap ├── composer.json └── LICENSE /src/Contracts/CurrencyError.php: -------------------------------------------------------------------------------- 1 | 2 | Javier Gómez <82575079+javiergomezadsmurai@users.noreply.github.com> 3 | Joel Rodríguez <33657339+joeladsmurai@users.noreply.github.com> 4 | Jordi Creus <113465751+jcadsmurai@users.noreply.github.com> 5 | Jordi Creus 6 | Jordi Creus 7 | Juanma Mingot 8 | Marc Hill <83693442+marchilladsmurai@users.noreply.github.com> 9 | Rubén Manzano <116172793+rubenmanzanoadsmurai@users.noreply.github.com> 10 | Álvaro Camacho <122893462+alvarocamacholugo@users.noreply.github.com> 11 | -------------------------------------------------------------------------------- /src/Contracts/MoneyFormat.php: -------------------------------------------------------------------------------- 1 | ct1 === $this->ct2) { 14 | throw new LogicException( 15 | 'Trying to construct InconsistentCurrencyTypesError with exactly equal CurrencyType instances' 16 | ); 17 | } 18 | 19 | parent::__construct('Same ISO currency code but different currency settings'); 20 | } 21 | 22 | /** 23 | * @return Currency[] 24 | */ 25 | public function getInconsistentCurrencyTypes(): array 26 | { 27 | return [$this->ct1, $this->ct2]; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "adsmurai/currency", 3 | "description": "A small library to handle currencies and money values", 4 | "keywords": ["currency", "money", "money pattern", "value object", "vo"], 5 | "type": "library", 6 | "license": "MIT", 7 | "authors": [ 8 | { 9 | "name": "Andreu Correa", 10 | "email": "andreu@adsmurai.com" 11 | }, 12 | { 13 | "name": "Jordi Creus", 14 | "email": "jordi@adsmurai.com" 15 | } 16 | ], 17 | "minimum-stability": "stable", 18 | "require": { 19 | "php": ">=8.1", 20 | "litipk/php-bignumbers": "^0.8" 21 | }, 22 | "require-dev": { 23 | "mockery/mockery": "^1.0", 24 | "phpunit/phpunit": "^11.0" 25 | }, 26 | "autoload": { 27 | "psr-4": { 28 | "Adsmurai\\Currency\\": "src/" 29 | } 30 | }, 31 | "autoload-dev": { 32 | "psr-4": { 33 | "Adsmurai\\Currency\\Tests\\": "tests/" 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Adsmurai S.L. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/MoneyFactory.php: -------------------------------------------------------------------------------- 1 | currency); 21 | } 22 | 23 | public function buildFromFractionalUnits(int $amount): MoneyContract 24 | { 25 | return Money::fromFractionalUnits($amount, $this->currency); 26 | } 27 | 28 | public function buildFromString(string $amount): MoneyContract 29 | { 30 | return Money::fromString($amount, $this->currency); 31 | } 32 | 33 | public function buildFromDecimal(Decimal $amount): MoneyContract 34 | { 35 | return Money::fromDecimal($amount, $this->currency); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/MoneyFactoriesLocator.php: -------------------------------------------------------------------------------- 1 | moneyFactories[$isoCode])) { 23 | $this->moneyFactories[$isoCode] = new MoneyFactory( 24 | $this->currencyFactory->buildFromISOCode($isoCode) 25 | ); 26 | } 27 | 28 | return $this->moneyFactories[$isoCode]; 29 | } 30 | 31 | /** @return string[] */ 32 | public function getSupportedCurrencyISOCodes(): array 33 | { 34 | return $this->currencyFactory->getSupportedCurrencyISOCodes(); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/Contracts/Money.php: -------------------------------------------------------------------------------- 1 | 17143 28 | * - 56.611 BD -> 56611 29 | */ 30 | public function getAmountAsFractionalUnits(): int; 31 | 32 | /** 33 | * Use this method to represent monetary amounts as strings. 34 | * 35 | * @param MoneyFormat $currencyFormat 36 | */ 37 | public function format(?MoneyFormat $currencyFormat = null): string; 38 | 39 | /** 40 | * Use this method to compare currency values. 41 | * It will return false if the amount or the currency types don't match. 42 | * 43 | * 44 | */ 45 | public function equals(Money $currency): bool; 46 | } 47 | -------------------------------------------------------------------------------- /src/Currency.php: -------------------------------------------------------------------------------- 1 | 8) { 36 | throw new InvalidArgumentException('Invalid number of fractional digits'); 37 | } 38 | 39 | if ('' === $symbol) { 40 | throw new InvalidArgumentException('Empty symbol'); 41 | } 42 | $this->symbol = $symbol; 43 | $this->numFractionalDigits = $numFractionalDigits; 44 | $this->symbolPlacement = $symbolPlacement; 45 | $this->name = $name; 46 | } 47 | 48 | public function getISOCode(): string 49 | { 50 | return $this->ISOCode; 51 | } 52 | 53 | public function getName(): string 54 | { 55 | return $this->name; 56 | } 57 | 58 | public function getSymbol(): string 59 | { 60 | return $this->symbol; 61 | } 62 | 63 | public function getNumFractionalDigits(): int 64 | { 65 | return $this->numFractionalDigits; 66 | } 67 | 68 | public function getSymbolPlacement(): int 69 | { 70 | return $this->symbolPlacement; 71 | } 72 | 73 | public function equals(CurrencyContract $currency): bool 74 | { 75 | if ($this === $currency) { 76 | return true; 77 | } 78 | 79 | if ($currency->getISOCode() !== $this->ISOCode) { 80 | return false; 81 | } 82 | 83 | if (!( 84 | $currency->getName() === $this->name && 85 | $currency->getSymbol() === $this->symbol && 86 | $currency->getNumFractionalDigits() === $this->numFractionalDigits && 87 | $currency->getSymbolPlacement() === $this->symbolPlacement 88 | )) { 89 | throw new InconsistentCurrenciesError($this, $currency); 90 | } 91 | 92 | return true; 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /src/MoneyFormat.php: -------------------------------------------------------------------------------- 1 | decimalsSeparator; 77 | } 78 | 79 | public function getThousandsSeparator(): string 80 | { 81 | return $this->thousandsSeparator; 82 | } 83 | 84 | public function getExtraPrecision(): int 85 | { 86 | return $this->extraPrecision; 87 | } 88 | 89 | public function getDecorationType(): int 90 | { 91 | return $this->decorationType; 92 | } 93 | 94 | public function getPrecision(): ?int 95 | { 96 | return $this->precision; 97 | } 98 | 99 | public function getDecorationSpace(): int 100 | { 101 | return $this->decorationSpace; 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /src/CurrencyFactory.php: -------------------------------------------------------------------------------- 1 | $currencyData) { 48 | if ( 49 | !self::hasValidISOCode($ISOCode) 50 | || !self::hasValidSymbol($currencyData) 51 | || !self::hasValidSymbolPlacement($currencyData) 52 | || !self::hasValidNumFractionalDigits($currencyData) 53 | ) { 54 | throw new InvalidCurrenciesDataError(); 55 | } 56 | } 57 | } 58 | 59 | private static function hasValidISOCode(int|string $ISOCode): bool 60 | { 61 | return \is_string($ISOCode) && ($ISOCode !== '' && $ISOCode !== '0'); 62 | } 63 | 64 | private static function hasValidSymbol(array $currencyData): bool 65 | { 66 | return 67 | isset($currencyData['symbol']) 68 | && \is_string($currencyData['symbol']) 69 | && (isset($currencyData['symbol']) && ($currencyData['symbol'] !== '' && $currencyData['symbol'] !== '0')); 70 | } 71 | 72 | private static function hasValidSymbolPlacement(array $currencyData): bool 73 | { 74 | return 75 | isset($currencyData['symbolPlacement']) 76 | && \is_int($currencyData['symbolPlacement']) 77 | && \in_array( 78 | $currencyData['symbolPlacement'], 79 | [ 80 | CurrencyContract::BEFORE_PLACEMENT, 81 | CurrencyContract::AFTER_PLACEMENT, 82 | ] 83 | ); 84 | } 85 | 86 | private static function hasValidNumFractionalDigits(array $currencyData): bool 87 | { 88 | return isset($currencyData['numFractionalDigits']) && \is_int($currencyData['numFractionalDigits']); 89 | } 90 | 91 | public function buildFromISOCode(string $ISOCode): CurrencyContract 92 | { 93 | if (!isset($this->data[$ISOCode])) { 94 | throw new UnsupportedCurrencyISOCodeError($ISOCode); 95 | } 96 | 97 | if (!isset($this->currencies[$ISOCode])) { 98 | $this->currencies[$ISOCode] = new Currency( 99 | $ISOCode, 100 | $this->data[$ISOCode]['symbol'], 101 | $this->data[$ISOCode]['numFractionalDigits'], 102 | $this->data[$ISOCode]['symbolPlacement'], 103 | (isset($this->data[$ISOCode]['name']) && !empty($this->data[$ISOCode]['name'])) 104 | ? $this->data[$ISOCode]['name'] 105 | : '' 106 | ); 107 | } 108 | 109 | return $this->currencies[$ISOCode]; 110 | } 111 | 112 | /** @return string[] */ 113 | public function getSupportedCurrencyISOCodes(): array 114 | { 115 | return \array_keys($this->data); 116 | } 117 | 118 | /** @return Currency[] */ 119 | public function getSupportedCurrencies(): array 120 | { 121 | foreach (array_keys($this->data) as $ISOCode) { 122 | $this->buildFromISOCode($ISOCode); 123 | } 124 | 125 | return array_values($this->currencies); 126 | } 127 | } 128 | -------------------------------------------------------------------------------- /src/Money.php: -------------------------------------------------------------------------------- 1 | 0*(([1-9]\d*|\d)(\.\d+)?))'; 18 | public const SIMPLE_CURRENCY_PATTERN = '/^'.self::DECIMAL_NUMBER_REGEXP.'$/x'; 19 | public const INNER_FRACTIONAL_DIGITS = 8; 20 | 21 | private function __construct(private readonly Decimal $amount, private readonly CurrencyContract $currency) 22 | { 23 | } 24 | 25 | public static function fromFloat(float $amount, CurrencyContract $currency): Money 26 | { 27 | try { 28 | return new self( 29 | Decimal::fromFloat($amount, self::INNER_FRACTIONAL_DIGITS), 30 | $currency 31 | ); 32 | } catch (InfiniteInputError $e) { 33 | throw new InvalidArgumentException('Currency amounts must be finite', 0, $e); 34 | } catch (NaNInputError $e) { 35 | throw new InvalidArgumentException('Currency amounts must be numbers', 0, $e); 36 | } 37 | } 38 | 39 | public static function fromFractionalUnits(int $amount, CurrencyContract $currency): Money 40 | { 41 | $decimalAmount = Decimal::fromInteger($amount) 42 | ->div( 43 | Decimal::fromInteger(10 ** $currency->getNumFractionalDigits()), 44 | self::INNER_FRACTIONAL_DIGITS 45 | ); 46 | 47 | return new self($decimalAmount, $currency); 48 | } 49 | 50 | public static function fromString(string $amount, CurrencyContract $currency): Money 51 | { 52 | return new self( 53 | self::extractNumericAmount($amount, $currency), 54 | $currency 55 | ); 56 | } 57 | 58 | private static function extractNumericAmount(string $amount, CurrencyContract $currency): Decimal 59 | { 60 | if ( 61 | 1 === \preg_match(self::SIMPLE_CURRENCY_PATTERN, $amount, $matches) || 62 | 1 === \preg_match(self::getAmountPlusIsoCodePattern($currency), $amount, $matches) || 63 | 1 === \preg_match(self::getAmountPlusSymbolPattern($currency), $amount, $matches) 64 | ) { 65 | return Decimal::fromString($matches['amount'], self::INNER_FRACTIONAL_DIGITS); 66 | } 67 | 68 | throw new InvalidArgumentException('Invalid currency value'); 69 | } 70 | 71 | private static function getAmountPlusIsoCodePattern(CurrencyContract $currency): string 72 | { 73 | return '/^'.self::DECIMAL_NUMBER_REGEXP.'\s*'.$currency->getISOCode().'$/x'; 74 | } 75 | 76 | private static function getAmountPlusSymbolPattern(CurrencyContract $currency): string 77 | { 78 | $escapedSymbol = \preg_quote($currency->getSymbol(), '/'); 79 | 80 | return (CurrencyContract::BEFORE_PLACEMENT === $currency->getSymbolPlacement()) 81 | ? '/^'.$escapedSymbol.'\s*'.self::DECIMAL_NUMBER_REGEXP.'$/x' 82 | : '/^'.self::DECIMAL_NUMBER_REGEXP.'\s*'.$escapedSymbol.'$/x'; 83 | } 84 | 85 | public static function fromDecimal(Decimal $amount, CurrencyContract $currency): Money 86 | { 87 | return new self( 88 | Decimal::fromDecimal($amount, self::INNER_FRACTIONAL_DIGITS), 89 | $currency 90 | ); 91 | } 92 | 93 | public function getCurrency(): CurrencyContract 94 | { 95 | return $this->currency; 96 | } 97 | 98 | /** 99 | * {@inheritdoc} 100 | */ 101 | public function getAmountAsDecimal(): Decimal 102 | { 103 | return $this->amount; 104 | } 105 | 106 | /** 107 | * {@inheritdoc} 108 | */ 109 | public function getAmountAsFractionalUnits(): int 110 | { 111 | return $this->amount 112 | ->mul( 113 | Decimal::fromInteger(10 ** $this->currency->getNumFractionalDigits()), 114 | self::INNER_FRACTIONAL_DIGITS 115 | ) 116 | ->asInteger(); 117 | } 118 | 119 | /** 120 | * {@inheritdoc} 121 | */ 122 | public function format(?MoneyFormatInterface $currencyFormat = null): string 123 | { 124 | if (is_null($currencyFormat)) { 125 | $currencyFormat = MoneyFormat::default(); 126 | } 127 | 128 | $nDecimals = $currencyFormat->getPrecision(); 129 | if (is_null($nDecimals)) { 130 | $nDecimals = $this->currency->getNumFractionalDigits() + $currencyFormat->getExtraPrecision(); 131 | } 132 | 133 | $amount = Decimal::fromDecimal($this->amount, $nDecimals); 134 | 135 | $number = ('' === $currencyFormat->getThousandsSeparator()) 136 | ? \str_replace('.', $currencyFormat->getDecimalsSeparator(), $amount->__toString()) // This is safer! 137 | : \number_format( 138 | $amount->asFloat(), 139 | $nDecimals, 140 | $currencyFormat->getDecimalsSeparator(), 141 | $currencyFormat->getThousandsSeparator() 142 | ); 143 | 144 | return $this->decorate($number, $currencyFormat); 145 | } 146 | 147 | private function decorate(string $number, MoneyFormatInterface $currencyFormat): string 148 | { 149 | $separator = (MoneyFormat::DECORATION_WITH_SPACE === $currencyFormat->getDecorationSpace()) 150 | ? ' ' 151 | : ''; 152 | 153 | return match ($currencyFormat->getDecorationType()) { 154 | MoneyFormat::DECORATION_NO_DECORATION => $number, 155 | MoneyFormat::DECORATION_ISO_CODE => $number.$separator.$this->currency->getISOCode(), 156 | default => (CurrencyContract::BEFORE_PLACEMENT === $this->currency->getSymbolPlacement()) 157 | ? $this->currency->getSymbol().$separator.$number 158 | : $number.$separator.$this->currency->getSymbol(), 159 | }; 160 | } 161 | 162 | /** 163 | * {@inheritdoc} 164 | */ 165 | public function equals(MoneyContract $currency): bool 166 | { 167 | return $currency === $this || ( 168 | $this->amount->equals($currency->getAmountAsDecimal()) && 169 | $this->currency->equals($currency->getCurrency()) 170 | ); 171 | } 172 | } 173 | -------------------------------------------------------------------------------- /src/Data/CurrencyTypes.php: -------------------------------------------------------------------------------- 1 | [ 12 | 'name' => 'United Arab Emirates Dirham', 13 | 'numFractionalDigits' => 2, 14 | 'symbol' => 'د.إ', 15 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 16 | ], 17 | 'AFN' => [ 18 | 'name' => 'Afghan Afghani', 19 | 'numFractionalDigits' => 2, 20 | 'symbol' => 'AFN', 21 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 22 | ], 23 | 'ALL' => [ 24 | 'name' => 'Albanian Lek', 25 | 'numFractionalDigits' => 2, 26 | 'symbol' => 'L', 27 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 28 | ], 29 | 'AMD' => [ 30 | 'name' => 'Armenian Dram', 31 | 'numFractionalDigits' => 2, 32 | 'symbol' => '֏', 33 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 34 | ], 35 | 'ANG' => [ 36 | 'name' => 'Netherlands Antillean Guilder', 37 | 'numFractionalDigits' => 2, 38 | 'symbol' => 'ANG', 39 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 40 | ], 41 | 'AOA' => [ 42 | 'numFractionalDigits' => 2, 43 | 'symbol' => 'Kz', 44 | 'name' => 'Angolan Kwanza', 45 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 46 | ], 47 | 'ARS' => [ 48 | 'name' => 'Argentine Peso', 49 | 'numFractionalDigits' => 2, 50 | 'symbol' => '$', 51 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 52 | ], 53 | 'AUD' => [ 54 | 'name' => 'Australian Dollar', 55 | 'numFractionalDigits' => 2, 56 | 'symbol' => '$A', 57 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 58 | ], 59 | 'AWG' => [ 60 | 'name' => 'Aruban Florin', 61 | 'numFractionalDigits' => 2, 62 | 'symbol' => 'AWG', 63 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 64 | ], 65 | 'AZN' => [ 66 | 'name' => 'Azerbaijani Manat', 67 | 'numFractionalDigits' => 2, 68 | 'symbol' => 'm', 69 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 70 | ], 71 | 'BAM' => [ 72 | 'name' => 'Bosnia-Herzegovina Convertible Mark', 73 | 'numFractionalDigits' => 2, 74 | 'symbol' => 'KM', 75 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 76 | ], 77 | 'BBD' => [ 78 | 'name' => 'Barbadian Dollar', 79 | 'numFractionalDigits' => 2, 80 | 'symbol' => 'BDS$', 81 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 82 | ], 83 | 'BDT' => [ 84 | 'name' => 'Bangladeshi Taka', 85 | 'numFractionalDigits' => 2, 86 | 'symbol' => 'Tk', 87 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 88 | ], 89 | 'BGN' => [ 90 | 'name' => 'Bulgarian Lev', 91 | 'numFractionalDigits' => 2, 92 | 'symbol' => 'лв', 93 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 94 | ], 95 | 'BHD' => [ 96 | 'name' => 'Bahraini Dinar', 97 | 'numFractionalDigits' => 3, 98 | 'symbol' => 'BD', 99 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 100 | ], 101 | 'BIF' => [ 102 | 'name' => 'Burundian Franc', 103 | 'numFractionalDigits' => 0, 104 | 'symbol' => 'BIF', 105 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 106 | ], 107 | 'BMD' => [ 108 | 'name' => 'Bermudan Dollar', 109 | 'numFractionalDigits' => 2, 110 | 'symbol' => 'BMD', 111 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 112 | ], 113 | 'BND' => [ 114 | 'name' => 'Brunei Dollar', 115 | 'numFractionalDigits' => 2, 116 | 'symbol' => 'BND', 117 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 118 | ], 119 | 'BOB' => [ 120 | 'name' => 'Bolivian Boliviano', 121 | 'numFractionalDigits' => 2, 122 | 'symbol' => 'Bs', 123 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 124 | ], 125 | 'BRL' => [ 126 | 'name' => 'Brazilian Real', 127 | 'numFractionalDigits' => 2, 128 | 'symbol' => 'R$', 129 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 130 | ], 131 | 'BSD' => [ 132 | 'name' => 'Bahamian Dollar', 133 | 'numFractionalDigits' => 2, 134 | 'symbol' => 'BSD', 135 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 136 | ], 137 | 'BTN' => [ 138 | 'name' => 'Bhutanese Ngultrum', 139 | 'numFractionalDigits' => 2, 140 | 'symbol' => 'BTN', 141 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 142 | ], 143 | 'BWP' => [ 144 | 'name' => 'Botswanan Pula', 145 | 'numFractionalDigits' => 2, 146 | 'symbol' => 'BWP', 147 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 148 | ], 149 | 'BYN' => [ 150 | 'name' => 'Belarusian Ruble', 151 | 'numFractionalDigits' => 2, 152 | 'symbol' => 'BYN', 153 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 154 | ], 155 | 'BZD' => [ 156 | 'name' => 'Belize Dollar', 157 | 'numFractionalDigits' => 2, 158 | 'symbol' => 'BZD', 159 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 160 | ], 161 | 'CAD' => [ 162 | 'name' => 'Canadian Dollar', 163 | 'numFractionalDigits' => 2, 164 | 'symbol' => 'Can$', 165 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 166 | ], 167 | 'CDF' => [ 168 | 'name' => 'Congolese Franc', 169 | 'numFractionalDigits' => 2, 170 | 'symbol' => 'CDF', 171 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 172 | ], 173 | 'CHF' => [ 174 | 'name' => 'Swiss Franc', 175 | 'numFractionalDigits' => 2, 176 | 'symbol' => 'CHF', 177 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 178 | ], 179 | 'CLP' => [ 180 | 'name' => 'Chilean Peso', 181 | 'numFractionalDigits' => 0, 182 | 'symbol' => '$', 183 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 184 | ], 185 | 'CNY' => [ 186 | 'name' => 'Chinese Yuan', 187 | 'numFractionalDigits' => 2, 188 | 'symbol' => '¥', 189 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 190 | ], 191 | 'COP' => [ 192 | 'name' => 'Colombian Peso', 193 | 'numFractionalDigits' => 2, 194 | 'symbol' => 'Col$', 195 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 196 | ], 197 | 'CRC' => [ 198 | 'name' => 'Costa Rican Colón', 199 | 'numFractionalDigits' => 2, 200 | 'symbol' => '₡', 201 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 202 | ], 203 | 'CUC' => [ 204 | 'name' => 'Cuban Convertible Peso', 205 | 'numFractionalDigits' => 2, 206 | 'symbol' => 'CUC', 207 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 208 | ], 209 | 'CUP' => [ 210 | 'name' => 'Cuban Peso', 211 | 'numFractionalDigits' => 2, 212 | 'symbol' => 'CUP', 213 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 214 | ], 215 | 'CVE' => [ 216 | 'name' => 'Cape Verdean Escudo', 217 | 'numFractionalDigits' => 2, 218 | 'symbol' => 'CVE', 219 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 220 | ], 221 | 'CZK' => [ 222 | 'name' => 'Czech Koruna', 223 | 'numFractionalDigits' => 2, 224 | 'symbol' => 'Kč', 225 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 226 | ], 227 | 'DJF' => [ 228 | 'name' => 'Djiboutian Franc', 229 | 'numFractionalDigits' => 0, 230 | 'symbol' => 'DJF', 231 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 232 | ], 233 | 'DKK' => [ 234 | 'name' => 'Danish Krone', 235 | 'numFractionalDigits' => 2, 236 | 'symbol' => 'kr', 237 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 238 | ], 239 | 'DOP' => [ 240 | 'name' => 'Dominican Peso', 241 | 'numFractionalDigits' => 2, 242 | 'symbol' => 'DOP', 243 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 244 | ], 245 | 'DZD' => [ 246 | 'name' => 'Algerian Dinar', 247 | 'numFractionalDigits' => 2, 248 | 'symbol' => 'DA', 249 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 250 | ], 251 | 'EGP' => [ 252 | 'name' => 'Egyptian Pound', 253 | 'numFractionalDigits' => 2, 254 | 'symbol' => '£', 255 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 256 | ], 257 | 'ERN' => [ 258 | 'name' => 'Eritrean Nakfa', 259 | 'numFractionalDigits' => 2, 260 | 'symbol' => 'ERN', 261 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 262 | ], 263 | 'ETB' => [ 264 | 'name' => 'Ethiopian Birr', 265 | 'numFractionalDigits' => 2, 266 | 'symbol' => 'ETB', 267 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 268 | ], 269 | 'EUR' => [ 270 | 'name' => 'Euro', 271 | 'numFractionalDigits' => 2, 272 | 'symbol' => '€', 273 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 274 | ], 275 | 'FJD' => [ 276 | 'name' => 'Fijian Dollar', 277 | 'numFractionalDigits' => 2, 278 | 'symbol' => 'FJD', 279 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 280 | ], 281 | 'FKP' => [ 282 | 'name' => 'Falkland Islands Pound', 283 | 'numFractionalDigits' => 2, 284 | 'symbol' => 'FKP', 285 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 286 | ], 287 | 'GBP' => [ 288 | 'name' => 'British Pound', 289 | 'numFractionalDigits' => 2, 290 | 'symbol' => '£', 291 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 292 | ], 293 | 'GEL' => [ 294 | 'name' => 'Georgian Lari', 295 | 'numFractionalDigits' => 2, 296 | 'symbol' => 'ლ', 297 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 298 | ], 299 | 'GHS' => [ 300 | 'name' => 'Ghanaian Cedi', 301 | 'numFractionalDigits' => 2, 302 | 'symbol' => 'GHS', 303 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 304 | ], 305 | 'GIP' => [ 306 | 'name' => 'Gibraltar Pound', 307 | 'numFractionalDigits' => 2, 308 | 'symbol' => 'GIP', 309 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 310 | ], 311 | 'GMD' => [ 312 | 'name' => 'Gambian Dalasi', 313 | 'numFractionalDigits' => 2, 314 | 'symbol' => 'GMD', 315 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 316 | ], 317 | 'GNF' => [ 318 | 'name' => 'Guinean Franc', 319 | 'numFractionalDigits' => 0, 320 | 'symbol' => 'GNF', 321 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 322 | ], 323 | 'GTQ' => [ 324 | 'name' => 'Guatemalan Quetzal', 325 | 'numFractionalDigits' => 2, 326 | 'symbol' => 'Q', 327 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 328 | ], 329 | 'GYD' => [ 330 | 'name' => 'Guyanaese Dollar', 331 | 'numFractionalDigits' => 2, 332 | 'symbol' => 'GYD', 333 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 334 | ], 335 | 'HKD' => [ 336 | 'name' => 'Hong Kong Dollar', 337 | 'numFractionalDigits' => 2, 338 | 'symbol' => 'HK$', 339 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 340 | ], 341 | 'HNL' => [ 342 | 'name' => 'Honduran Lempira', 343 | 'numFractionalDigits' => 2, 344 | 'symbol' => 'L', 345 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 346 | ], 347 | 'HTG' => [ 348 | 'name' => 'Haitian Gourde', 349 | 'numFractionalDigits' => 2, 350 | 'symbol' => 'HTG', 351 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 352 | ], 353 | 'HUF' => [ 354 | 'name' => 'Hungarian Forint', 355 | 'numFractionalDigits' => 2, 356 | 'symbol' => 'Ft', 357 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 358 | ], 359 | 'IDR' => [ 360 | 'name' => 'Indonesian Rupiah', 361 | 'numFractionalDigits' => 2, 362 | 'symbol' => 'Rp', 363 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 364 | ], 365 | 'ILS' => [ 366 | 'name' => 'Israeli New Shekel', 367 | 'numFractionalDigits' => 2, 368 | 'symbol' => '₪', 369 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 370 | ], 371 | 'INR' => [ 372 | 'name' => 'Indian Rupee', 373 | 'numFractionalDigits' => 2, 374 | 'symbol' => '₹', 375 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 376 | ], 377 | 'IQD' => [ 378 | 'name' => 'Iraqi Dinar', 379 | 'numFractionalDigits' => 3, 380 | 'symbol' => 'IQD', 381 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 382 | ], 383 | 'IRR' => [ 384 | 'name' => 'Iranian Rial', 385 | 'numFractionalDigits' => 2, 386 | 'symbol' => 'IRR', 387 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 388 | ], 389 | 'ISK' => [ 390 | 'name' => 'Icelandic Króna', 391 | 'numFractionalDigits' => 0, 392 | 'symbol' => 'kr', 393 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 394 | ], 395 | 'JMD' => [ 396 | 'name' => 'Jamaican Dollar', 397 | 'numFractionalDigits' => 2, 398 | 'symbol' => 'JMD', 399 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 400 | ], 401 | 'JOD' => [ 402 | 'name' => 'Jordanian Dinar', 403 | 'numFractionalDigits' => 3, 404 | 'symbol' => 'JD', 405 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 406 | ], 407 | 'JPY' => [ 408 | 'name' => 'Japanese Yen', 409 | 'numFractionalDigits' => 0, 410 | 'symbol' => '¥', 411 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 412 | ], 413 | 'KES' => [ 414 | 'name' => 'Kenyan Shilling', 415 | 'numFractionalDigits' => 2, 416 | 'symbol' => 'KSh', 417 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 418 | ], 419 | 'KGS' => [ 420 | 'name' => 'Kyrgystani Som', 421 | 'numFractionalDigits' => 2, 422 | 'symbol' => 'KGS', 423 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 424 | ], 425 | 'KHR' => [ 426 | 'name' => 'Cambodian Riel', 427 | 'numFractionalDigits' => 2, 428 | 'symbol' => 'KHR', 429 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 430 | ], 431 | 'KMF' => [ 432 | 'name' => 'Comorian Franc', 433 | 'numFractionalDigits' => 0, 434 | 'symbol' => 'KMF', 435 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 436 | ], 437 | 'KPW' => [ 438 | 'name' => 'North Korean Won', 439 | 'numFractionalDigits' => 2, 440 | 'symbol' => 'KPW', 441 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 442 | ], 443 | 'KRW' => [ 444 | 'name' => 'South Korean Won', 445 | 'numFractionalDigits' => 0, 446 | 'symbol' => '₩', 447 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 448 | ], 449 | 'KWD' => [ 450 | 'name' => 'Kuwaiti Dinar', 451 | 'numFractionalDigits' => 3, 452 | 'symbol' => 'د.ك', 453 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 454 | ], 455 | 'KYD' => [ 456 | 'name' => 'Cayman Islands Dollar', 457 | 'numFractionalDigits' => 2, 458 | 'symbol' => 'KYD', 459 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 460 | ], 461 | 'KZT' => [ 462 | 'name' => 'Kazakhstani Tenge', 463 | 'numFractionalDigits' => 2, 464 | 'symbol' => '₸', 465 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 466 | ], 467 | 'LAK' => [ 468 | 'name' => 'Laotian Kip', 469 | 'numFractionalDigits' => 2, 470 | 'symbol' => 'LAK', 471 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 472 | ], 473 | 'LBP' => [ 474 | 'name' => 'Lebanese Pound', 475 | 'numFractionalDigits' => 2, 476 | 'symbol' => 'ل.ل', 477 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 478 | ], 479 | 'LKR' => [ 480 | 'name' => 'Sri Lankan Rupee', 481 | 'numFractionalDigits' => 2, 482 | 'symbol' => 'Rs', 483 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 484 | ], 485 | 'LRD' => [ 486 | 'name' => 'Liberian Dollar', 487 | 'numFractionalDigits' => 2, 488 | 'symbol' => 'LRD', 489 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 490 | ], 491 | 'LSL' => [ 492 | 'name' => 'Lesotho Loti', 493 | 'numFractionalDigits' => 2, 494 | 'symbol' => 'LSL', 495 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 496 | ], 497 | 'LYD' => [ 498 | 'name' => 'Libyan Dinar', 499 | 'numFractionalDigits' => 3, 500 | 'symbol' => 'LYD', 501 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 502 | ], 503 | 'MAD' => [ 504 | 'name' => 'Moroccan Dirham', 505 | 'numFractionalDigits' => 2, 506 | 'symbol' => 'درهم', 507 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 508 | ], 509 | 'MDL' => [ 510 | 'name' => 'Moldovan Leu', 511 | 'numFractionalDigits' => 2, 512 | 'symbol' => 'MDL', 513 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 514 | ], 515 | 'MGA' => [ 516 | 'name' => 'Malagasy Ariary', 517 | 'numFractionalDigits' => 2, 518 | 'symbol' => 'MGA', 519 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 520 | ], 521 | 'MKD' => [ 522 | 'name' => 'Macedonian Denar', 523 | 'numFractionalDigits' => 2, 524 | 'symbol' => 'Ден', 525 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 526 | ], 527 | 'MMK' => [ 528 | 'name' => 'Myanmar Kyat', 529 | 'numFractionalDigits' => 2, 530 | 'symbol' => 'MMK', 531 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 532 | ], 533 | 'MNT' => [ 534 | 'name' => 'Mongolian Tugrik', 535 | 'numFractionalDigits' => 2, 536 | 'symbol' => 'MNT', 537 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 538 | ], 539 | 'MOP' => [ 540 | 'name' => 'Macanese Pataca', 541 | 'numFractionalDigits' => 2, 542 | 'symbol' => 'MOP$', 543 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 544 | ], 545 | 'MRU' => [ 546 | 'name' => 'Mauritanian Ouguiya', 547 | 'numFractionalDigits' => 2, 548 | 'symbol' => 'MRU', 549 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 550 | ], 551 | 'MUR' => [ 552 | 'name' => 'Mauritian Rupee', 553 | 'numFractionalDigits' => 2, 554 | 'symbol' => 'MUR', 555 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 556 | ], 557 | 'MVR' => [ 558 | 'name' => 'Maldivian Rufiyaa', 559 | 'numFractionalDigits' => 2, 560 | 'symbol' => 'MVR', 561 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 562 | ], 563 | 'MWK' => [ 564 | 'name' => 'Malawian Kwacha', 565 | 'numFractionalDigits' => 2, 566 | 'symbol' => 'MWK', 567 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 568 | ], 569 | 'MXN' => [ 570 | 'name' => 'Mexican Peso', 571 | 'numFractionalDigits' => 2, 572 | 'symbol' => 'Mex$', 573 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 574 | ], 575 | 'MYR' => [ 576 | 'name' => 'Malaysian Ringgit', 577 | 'numFractionalDigits' => 2, 578 | 'symbol' => 'RM', 579 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 580 | ], 581 | 'MZN' => [ 582 | 'name' => 'Mozambican Metical', 583 | 'numFractionalDigits' => 2, 584 | 'symbol' => 'MZN', 585 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 586 | ], 587 | 'NAD' => [ 588 | 'name' => 'Namibian Dollar', 589 | 'numFractionalDigits' => 2, 590 | 'symbol' => 'NAD', 591 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 592 | ], 593 | 'NGN' => [ 594 | 'name' => 'Nigerian Naira', 595 | 'numFractionalDigits' => 2, 596 | 'symbol' => '₦', 597 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 598 | ], 599 | 'NIO' => [ 600 | 'name' => 'Nicaraguan Córdoba', 601 | 'numFractionalDigits' => 2, 602 | 'symbol' => 'C$', 603 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 604 | ], 605 | 'NOK' => [ 606 | 'name' => 'Norwegian Krone', 607 | 'numFractionalDigits' => 2, 608 | 'symbol' => 'kr', 609 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 610 | ], 611 | 'NPR' => [ 612 | 'name' => 'Nepalese Rupee', 613 | 'numFractionalDigits' => 2, 614 | 'symbol' => 'NPR', 615 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 616 | ], 617 | 'NZD' => [ 618 | 'name' => 'New Zealand Dollar', 619 | 'numFractionalDigits' => 2, 620 | 'symbol' => '$NZ', 621 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 622 | ], 623 | 'OMR' => [ 624 | 'name' => 'Omani Rial', 625 | 'numFractionalDigits' => 3, 626 | 'symbol' => 'ر.ع.', 627 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 628 | ], 629 | 'PAB' => [ 630 | 'name' => 'Panamanian Balboa', 631 | 'numFractionalDigits' => 2, 632 | 'symbol' => 'B/', 633 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 634 | ], 635 | 'PEN' => [ 636 | 'name' => 'Peruvian Sol', 637 | 'numFractionalDigits' => 2, 638 | 'symbol' => 'S/', 639 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 640 | ], 641 | 'PGK' => [ 642 | 'name' => 'Papua New Guinean Kina', 643 | 'numFractionalDigits' => 2, 644 | 'symbol' => 'PGK', 645 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 646 | ], 647 | 'PHP' => [ 648 | 'name' => 'Philippine Peso', 649 | 'numFractionalDigits' => 2, 650 | 'symbol' => '₱', 651 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 652 | ], 653 | 'PKR' => [ 654 | 'name' => 'Pakistani Rupee', 655 | 'numFractionalDigits' => 2, 656 | 'symbol' => 'Rs', 657 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 658 | ], 659 | 'PLN' => [ 660 | 'name' => 'Polish Zloty', 661 | 'numFractionalDigits' => 2, 662 | 'symbol' => 'zł', 663 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 664 | ], 665 | 'PYG' => [ 666 | 'name' => 'Paraguayan Guarani', 667 | 'numFractionalDigits' => 0, 668 | 'symbol' => '₲', 669 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 670 | ], 671 | 'QAR' => [ 672 | 'name' => 'Qatari Riyal', 673 | 'numFractionalDigits' => 2, 674 | 'symbol' => 'ر.ق', 675 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 676 | ], 677 | 'RON' => [ 678 | 'name' => 'Romanian Leu', 679 | 'numFractionalDigits' => 2, 680 | 'symbol' => 'L', 681 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 682 | ], 683 | 'RSD' => [ 684 | 'name' => 'Serbian Dinar', 685 | 'numFractionalDigits' => 2, 686 | 'symbol' => 'дин', 687 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 688 | ], 689 | 'RUB' => [ 690 | 'name' => 'Russian Ruble', 691 | 'numFractionalDigits' => 2, 692 | 'symbol' => '₽', 693 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 694 | ], 695 | 'RWF' => [ 696 | 'name' => 'Rwandan Franc', 697 | 'numFractionalDigits' => 0, 698 | 'symbol' => 'RWF', 699 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 700 | ], 701 | 'SAR' => [ 702 | 'name' => 'Saudi Riyal', 703 | 'numFractionalDigits' => 2, 704 | 'symbol' => 'ر.س', 705 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 706 | ], 707 | 'SBD' => [ 708 | 'name' => 'Solomon Islands Dollar', 709 | 'numFractionalDigits' => 2, 710 | 'symbol' => 'SBD', 711 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 712 | ], 713 | 'SCR' => [ 714 | 'name' => 'Seychellois Rupee', 715 | 'numFractionalDigits' => 2, 716 | 'symbol' => 'SCR', 717 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 718 | ], 719 | 'SDG' => [ 720 | 'name' => 'Sudanese Pound', 721 | 'numFractionalDigits' => 2, 722 | 'symbol' => 'SDG', 723 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 724 | ], 725 | 'SEK' => [ 726 | 'name' => 'Swedish Krona', 727 | 'numFractionalDigits' => 2, 728 | 'symbol' => 'kr', 729 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 730 | ], 731 | 'SGD' => [ 732 | 'name' => 'Singapore Dollar', 733 | 'numFractionalDigits' => 2, 734 | 'symbol' => 'S$', 735 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 736 | ], 737 | 'SHP' => [ 738 | 'name' => 'St. Helena Pound', 739 | 'numFractionalDigits' => 2, 740 | 'symbol' => 'SHP', 741 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 742 | ], 743 | 'SLE' => [ 744 | 'name' => 'Sierra Leonean Leone', 745 | 'numFractionalDigits' => 2, 746 | 'symbol' => 'SLE', 747 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 748 | ], 749 | 'SOS' => [ 750 | 'name' => 'Somali Shilling', 751 | 'numFractionalDigits' => 2, 752 | 'symbol' => 'SOS', 753 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 754 | ], 755 | 'SRD' => [ 756 | 'name' => 'Surinamese Dollar', 757 | 'numFractionalDigits' => 2, 758 | 'symbol' => 'SRD', 759 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 760 | ], 761 | 'SSP' => [ 762 | 'name' => 'South Sudanese Pound', 763 | 'numFractionalDigits' => 2, 764 | 'symbol' => 'SSP', 765 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 766 | ], 767 | 'STN' => [ 768 | 'name' => 'São Tomé & Príncipe Dobra', 769 | 'numFractionalDigits' => 2, 770 | 'symbol' => 'STN', 771 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 772 | ], 773 | 'SVC' => [ 774 | 'name' => 'Salvadoran Colón', 775 | 'numFractionalDigits' => 2, 776 | 'symbol' => 'SVC', 777 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 778 | ], 779 | 'SYP' => [ 780 | 'name' => 'Syrian Pound', 781 | 'numFractionalDigits' => 2, 782 | 'symbol' => 'SYP', 783 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 784 | ], 785 | 'SZL' => [ 786 | 'name' => 'Swazi Lilangeni', 787 | 'numFractionalDigits' => 2, 788 | 'symbol' => 'SZL', 789 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 790 | ], 791 | 'THB' => [ 792 | 'name' => 'Thai Baht', 793 | 'numFractionalDigits' => 2, 794 | 'symbol' => '฿', 795 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 796 | ], 797 | 'TJS' => [ 798 | 'name' => 'Tajikistani Somoni', 799 | 'numFractionalDigits' => 2, 800 | 'symbol' => 'TJS', 801 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 802 | ], 803 | 'TMT' => [ 804 | 'name' => 'Turkmenistani Manat', 805 | 'numFractionalDigits' => 2, 806 | 'symbol' => 'TMT', 807 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 808 | ], 809 | 'TND' => [ 810 | 'name' => 'Tunisian Dinar', 811 | 'numFractionalDigits' => 3, 812 | 'symbol' => 'د.ت', 813 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 814 | ], 815 | 'TOP' => [ 816 | 'name' => 'Tongan Paʻanga', 817 | 'numFractionalDigits' => 2, 818 | 'symbol' => 'TOP', 819 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 820 | ], 821 | 'TRY' => [ 822 | 'name' => 'Turkish Lira', 823 | 'numFractionalDigits' => 2, 824 | 'symbol' => '₺', 825 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 826 | ], 827 | 'TTD' => [ 828 | 'name' => 'Trinidad & Tobago Dollar', 829 | 'numFractionalDigits' => 2, 830 | 'symbol' => 'TTD', 831 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 832 | ], 833 | 'TWD' => [ 834 | 'name' => 'New Taiwan Dollar', 835 | 'numFractionalDigits' => 2, 836 | 'symbol' => 'NT$', 837 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 838 | ], 839 | 'TZS' => [ 840 | 'name' => 'Tanzanian Shilling', 841 | 'numFractionalDigits' => 2, 842 | 'symbol' => 'TZS', 843 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 844 | ], 845 | 'UAH' => [ 846 | 'name' => 'Ukrainian Hryvnia', 847 | 'numFractionalDigits' => 2, 848 | 'symbol' => '₴', 849 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 850 | ], 851 | 'UGX' => [ 852 | 'name' => 'Ugandan Shilling', 853 | 'numFractionalDigits' => 0, 854 | 'symbol' => 'UGX', 855 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 856 | ], 857 | 'USD' => [ 858 | 'name' => 'US Dollar', 859 | 'numFractionalDigits' => 2, 860 | 'symbol' => '$', 861 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 862 | ], 863 | 'UYU' => [ 864 | 'name' => 'Uruguayan Peso', 865 | 'numFractionalDigits' => 2, 866 | 'symbol' => 'Ur$', 867 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 868 | ], 869 | 'UZS' => [ 870 | 'name' => 'Uzbekistani Som', 871 | 'numFractionalDigits' => 2, 872 | 'symbol' => 'UZS', 873 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 874 | ], 875 | 'VED' => [ 876 | 'name' => 'Bolívar Soberano', 877 | 'numFractionalDigits' => 2, 878 | 'symbol' => 'VED', 879 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 880 | ], 881 | 'VES' => [ 882 | 'name' => 'Venezuelan Bolívar', 883 | 'numFractionalDigits' => 2, 884 | 'symbol' => 'VES', 885 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 886 | ], 887 | 'VND' => [ 888 | 'name' => 'Vietnamese Dong', 889 | 'numFractionalDigits' => 0, 890 | 'symbol' => '₫', 891 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 892 | ], 893 | 'VUV' => [ 894 | 'name' => 'Vanuatu Vatu', 895 | 'numFractionalDigits' => 0, 896 | 'symbol' => 'VUV', 897 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 898 | ], 899 | 'WST' => [ 900 | 'name' => 'Samoan Tala', 901 | 'numFractionalDigits' => 2, 902 | 'symbol' => 'WST', 903 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 904 | ], 905 | 'XAF' => [ 906 | 'name' => 'Central African CFA Franc', 907 | 'numFractionalDigits' => 0, 908 | 'symbol' => 'FCFA', 909 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 910 | ], 911 | 'XCD' => [ 912 | 'name' => 'East Caribbean Dollar', 913 | 'numFractionalDigits' => 2, 914 | 'symbol' => 'EC$', 915 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 916 | ], 917 | 'XOF' => [ 918 | 'name' => 'West African CFA Franc', 919 | 'numFractionalDigits' => 0, 920 | 'symbol' => 'F CFA', 921 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 922 | ], 923 | 'XPF' => [ 924 | 'name' => 'CFP Franc', 925 | 'numFractionalDigits' => 0, 926 | 'symbol' => 'CFPF', 927 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 928 | ], 929 | 'YER' => [ 930 | 'name' => 'Yemeni Rial', 931 | 'numFractionalDigits' => 2, 932 | 'symbol' => 'YER', 933 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 934 | ], 935 | 'ZAR' => [ 936 | 'name' => 'South African Rand', 937 | 'numFractionalDigits' => 2, 938 | 'symbol' => 'R', 939 | 'symbolPlacement' => Currency::BEFORE_PLACEMENT, 940 | ], 941 | 'ZMW' => [ 942 | 'name' => 'Zambian Kwacha', 943 | 'numFractionalDigits' => 2, 944 | 'symbol' => 'ZMW', 945 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 946 | ], 947 | 'ZWL' => [ 948 | 'name' => 'Zimbabwean Dollar (2009)', 949 | 'numFractionalDigits' => 2, 950 | 'symbol' => 'ZWL', 951 | 'symbolPlacement' => Currency::AFTER_PLACEMENT, 952 | ], 953 | ]; 954 | // @codeCoverageIgnoreEnd 955 | --------------------------------------------------------------------------------