diff --git a/src/Symfony/Component/Intl/CHANGELOG.md b/src/Symfony/Component/Intl/CHANGELOG.md index 33efad1f5b2f5..663e06ded8e92 100644 --- a/src/Symfony/Component/Intl/CHANGELOG.md +++ b/src/Symfony/Component/Intl/CHANGELOG.md @@ -5,6 +5,7 @@ CHANGELOG --- * Allow Kosovo as a component region, controlled by the `SYMFONY_INTL_WITH_USER_ASSIGNED` env var + * Add `isActive()` to check if a given currency is available in at least 1 region 7.1 --- diff --git a/src/Symfony/Component/Intl/Currencies.php b/src/Symfony/Component/Intl/Currencies.php index ce7fe5e2a84b7..3e7ae16ec9401 100644 --- a/src/Symfony/Component/Intl/Currencies.php +++ b/src/Symfony/Component/Intl/Currencies.php @@ -139,6 +139,156 @@ public static function forNumericCode(int $numericCode): array return self::readEntry(['NumericToAlpha3', (string) $numericCode], 'meta'); } + /** + * @param non-empty-string $country e.g. 'FR' + * @param ?bool $legalTender if the currency must be a legal tender. Using null do not filter anything + * @param bool $activeOnly exclude currencies that are not active on the given $date in countries + * @param string $date The date string on which the check will be performed + * + * @throws MissingResourceException if the given $country does not exist + * + * @return array + */ + public static function forCountry( + string $country, + ?bool $legalTender = true, + bool $activeOnly = true, + string $date = 'today', + ): array { + $currenciesMetadata = self::readEntry(['Map', $country], 'meta'); + + $currencies = []; + + foreach ($currenciesMetadata as $currency => $currencyMetadata) { + if (null !== $legalTender && $legalTender !== self::isLegalTender($currencyMetadata)) { + continue; + } + + if (!$activeOnly) { + $currencies[$currency] = $currencyMetadata; + + continue; + } + + if (!self::isActive($country, $currency, $currencyMetadata, $date)) { + continue; + } + + $currencies[$currency] = $currencyMetadata; + } + + return $currencies; + } + + /** + * @param non-empty-string $country e.g. 'FR' + * @param non-empty-string $currency e.g. 'USD' + * @param string $date The date that will be checked when $activeOnly is set to true + */ + public static function existsInCountry( + string $country, + string $currency, + bool $activeOnly = true, + string $date = 'today', + ): bool { + try { + $currencyMetadata = self::readEntry(['Map', $country, $currency], 'meta'); + } catch (MissingResourceException) { + return false; + } + + if (!$activeOnly) { + return true; + } + + return self::isActive($country, $currency, $currencyMetadata, $date); + } + + /** + * @param array{tender?: bool} $currencyMetadata + */ + private static function isLegalTender(array $currencyMetadata): bool + { + return !\array_key_exists('tender', $currencyMetadata) || false !== $currencyMetadata['tender']; + } + + /** + * @param non-empty-string $country e.g. 'FR' + * @param non-empty-string $currency e.g. 'USD' + * @param array{from?: non-empty-string, to?: non-empty-string} $currencyMetadata + * @param string $date The date on which the check will be performed + */ + private static function isActive(string $country, string $currency, array $currencyMetadata, string $date = 'today'): bool + { + if (!\array_key_exists('from', $currencyMetadata)) { + // Note: currencies that are not legal tender don't have often validity dates. + throw new \RuntimeException("Cannot check whether the currency $currency is active or not because they are no validity dates available."); + } + + $from = \DateTimeImmutable::createFromFormat('Y-m-d', $currencyMetadata['from']); + + if (!$from) { + throw new \RuntimeException("Unable to parse the `from` date for currency $currency in country $country."); + } + + if (\array_key_exists('to', $currencyMetadata)) { + $to = \DateTimeImmutable::createFromFormat('Y-m-d', $currencyMetadata['to']); + + if (!$to) { + throw new \RuntimeException("Unable to parse the `to` date for currency $currency in country $country."); + } + } else { + $to = null; + } + + try { + $date = new \DateTimeImmutable($date); + } catch (\DateMalformedStringException $exception) { + throw new \InvalidArgumentException("Invalid date provided: $date.", previous: $exception); + } + + return $from <= $date && (null === $to || $to >= $date); + } + + /** + * @param non-empty-string $currency e.g. 'USD' + * @param ?bool $legalTender if the currency must be a legal tender. Using null do not filter anything + * @param bool $activeOnly exclude currencies that are not active on the given $date in countries + * @param string $date the date on which the check will be performed if $activeOnly is set to true + */ + public static function existsInAtLeastOneCountry( + string $currency, + ?bool $legalTender = true, + bool $activeOnly = true, + string $date = 'today', + ): bool { + $countries = self::readEntry(['Map'], 'meta'); + + foreach ($countries as $countryCode => $country) { + foreach ($country as $currencyCode => $currencyMetadata) { + if ($currencyCode !== $currency) { + continue; + } + + if (null !== $legalTender && $legalTender !== self::isLegalTender($currencyMetadata)) { + continue; + } + + if (!$activeOnly) { + return true; + } + + if (!self::isActive($countryCode, $currencyCode, $currencyMetadata, $date)) { + continue; + } + + return true; + } + } + + return false; + } + protected static function getPath(): string { return Intl::getDataDirectory().'/'.Intl::CURRENCY_DIR; diff --git a/src/Symfony/Component/Intl/Data/Generator/CurrencyDataGenerator.php b/src/Symfony/Component/Intl/Data/Generator/CurrencyDataGenerator.php index 7eae9d0f112c9..ec75e7d0ccc83 100644 --- a/src/Symfony/Component/Intl/Data/Generator/CurrencyDataGenerator.php +++ b/src/Symfony/Component/Intl/Data/Generator/CurrencyDataGenerator.php @@ -48,6 +48,54 @@ class CurrencyDataGenerator extends AbstractDataGenerator */ private array $currencyCodes = []; + /** + * Decode ICU "date pair" into a DateTimeImmutable (UTC). + * + * ICU stores UDate = milliseconds since 1970-01-01T00:00:00Z in a signed 64-bit. + * + * @param array{0: int, 1: int} $pair + * + * @return non-empty-string + */ + private static function icuPairToDate(array $pair): string + { + [$highBits32, $lowBits32] = $pair; + + // Recompose a 64-bit unsigned integer from two 32-bit chunks. + $unsigned64 = ((($highBits32 & 0xFFFFFFFF) << 32) | ($lowBits32 & 0xFFFFFFFF)); + + // Convert to signed 64-bit (two's complement) if sign bit is set. + if ($unsigned64 >= (1 << 63)) { + $unsigned64 -= (1 << 64); + } + + // Split into seconds and milliseconds. + $seconds = intdiv($unsigned64, 1000); + $millisecondsRemainder = $unsigned64 - $seconds * 1000; + + // Normalize negative millisecond remainders (e.g., for pre-1970 values) + if (0 > $millisecondsRemainder) { + $millisecondsRemainder += 1000; + + --$seconds; + } + + // Build "U.u" string (seconds.microseconds). Pad ms to 3 digits, then add 000 to get microseconds. + $epochWithMicros = \sprintf('%d.%03d000', $seconds, $millisecondsRemainder); + + $datetime = \DateTimeImmutable::createFromFormat( + 'U.u', + $epochWithMicros, + new \DateTimeZone('UTC'), + ); + + if (false === $datetime) { + throw new \RuntimeException('Unable to parse ICU milliseconds pair.'); + } + + return $datetime->format('Y-m-d'); + } + protected function scanLocales(LocaleScanner $scanner, string $sourceDir): array { return $scanner->scanLocales($sourceDir.'/curr'); @@ -102,6 +150,7 @@ protected function generateDataForMeta(BundleEntryReaderInterface $reader, strin $data = [ 'Currencies' => $this->currencyCodes, 'Meta' => $this->generateCurrencyMeta($supplementalDataBundle), + 'Map' => $this->generateCurrencyMap($supplementalDataBundle), 'Alpha3ToNumeric' => $this->generateAlpha3ToNumericMapping($numericCodesBundle, $this->currencyCodes), ]; @@ -125,6 +174,83 @@ private function generateCurrencyMeta(ArrayAccessibleResourceBundle $supplementa return iterator_to_array($supplementalDataBundle['CurrencyMeta']); } + /** + * @return array + */ + private function generateCurrencyMap(mixed $supplementalDataBundle): array + { + /** + * @var list> $regionsData + */ + $regionsData = []; + + /** + * The key is the country iso3166 identifier (e.g. "CH"). + * + * @var array $regions + */ + $regions = iterator_to_array($supplementalDataBundle['CurrencyMap']); + + foreach ($regions as $regionId => $region) { + /** + * @var list<\ResourceBundle> $currencies + */ + $currencies = iterator_to_array($region); + + foreach ($currencies as $metadata) { + /** + * Note 1: The "to" property (if present) is always greater than "from". + * Note 2: The "to" property may be missing if the currency is still in use. + * Note 3: The "tender" property indicates whether the country legally recognizes the currency within + * its borders. This property is explicitly set to `false` only if that is not the case; + * otherwise, it is `true` by default. + * Note 4: The "from" and "to" dates are not stored as strings; they are stored as a pair of integers. + * Note 5: The "to" property may be missing if "tender" is set to `false`. + * + * @var array{ + * from?: array{0: int, 1: int}, + * to?: array{0: int, 2: int}, + * tender?: bool, + * id: non-empty-string + * } $metadata + */ + $metadata = iterator_to_array($metadata); + + $id = $metadata['id']; + + unset($metadata['id']); + + if (\array_key_exists($id, self::DENYLIST)) { + continue; + } + + if (\array_key_exists('from', $metadata)) { + $metadata['from'] = self::icuPairToDate($metadata['from']); + } + + if (\array_key_exists('to', $metadata)) { + $metadata['to'] = self::icuPairToDate($metadata['to']); + } + + if (\array_key_exists('tender', $metadata)) { + $metadata['tender'] = filter_var($metadata['tender'], \FILTER_VALIDATE_BOOLEAN, \FILTER_NULL_ON_FAILURE); + + if (null === $metadata['tender']) { + throw new \RuntimeException('Unexpected boolean value for tender attribute.'); + } + } + + $regionsData[$regionId][$id] = $metadata; + } + } + + return $regionsData; + } + private function generateAlpha3ToNumericMapping(ArrayAccessibleResourceBundle $numericCodesBundle, array $currencyCodes): array { $alpha3ToNumericMapping = iterator_to_array($numericCodesBundle['codeMap']); diff --git a/src/Symfony/Component/Intl/Resources/data/currencies/meta.php b/src/Symfony/Component/Intl/Resources/data/currencies/meta.php index d3e918df444dc..08b405148757c 100644 --- a/src/Symfony/Component/Intl/Resources/data/currencies/meta.php +++ b/src/Symfony/Component/Intl/Resources/data/currencies/meta.php @@ -737,6 +737,2229 @@ 0, ], ], + 'Map' => [ + 'AC' => [ + 'SHP' => [ + 'from' => '1976-01-01', + ], + ], + 'AD' => [ + 'EUR' => [ + 'from' => '1999-01-01', + ], + 'ESP' => [ + 'from' => '1873-01-01', + 'to' => '2002-02-28', + ], + 'FRF' => [ + 'from' => '1960-01-01', + 'to' => '2002-02-17', + ], + 'ADP' => [ + 'from' => '1936-01-01', + 'to' => '2001-12-31', + ], + ], + 'AE' => [ + 'AED' => [ + 'from' => '1973-05-19', + ], + ], + 'AF' => [ + 'AFN' => [ + 'from' => '2002-10-07', + ], + 'AFA' => [ + 'from' => '1927-03-14', + 'to' => '2002-12-31', + ], + ], + 'AG' => [ + 'XCD' => [ + 'from' => '1965-10-06', + ], + ], + 'AI' => [ + 'XCD' => [ + 'from' => '1965-10-06', + ], + ], + 'AL' => [ + 'ALL' => [ + 'from' => '1965-08-16', + ], + 'ALK' => [ + 'from' => '1946-11-01', + 'to' => '1965-08-16', + ], + ], + 'AM' => [ + 'AMD' => [ + 'from' => '1993-11-22', + ], + 'RUR' => [ + 'from' => '1991-12-25', + 'to' => '1993-11-22', + ], + 'SUR' => [ + 'from' => '1961-01-01', + 'to' => '1991-12-25', + ], + ], + 'AO' => [ + 'AOA' => [ + 'from' => '1999-12-13', + ], + 'AOR' => [ + 'from' => '1995-07-01', + 'to' => '2000-02-01', + ], + 'AON' => [ + 'from' => '1990-09-25', + 'to' => '2000-02-01', + ], + 'AOK' => [ + 'from' => '1977-01-08', + 'to' => '1991-03-01', + ], + ], + 'AR' => [ + 'ARS' => [ + 'from' => '1992-01-01', + ], + 'ARA' => [ + 'from' => '1985-06-14', + 'to' => '1992-01-01', + ], + 'ARP' => [ + 'from' => '1983-06-01', + 'to' => '1985-06-14', + ], + 'ARL' => [ + 'from' => '1970-01-01', + 'to' => '1983-06-01', + ], + 'ARM' => [ + 'from' => '1881-11-05', + 'to' => '1970-01-01', + ], + ], + 'AS' => [ + 'USD' => [ + 'from' => '1904-07-16', + ], + ], + 'AT' => [ + 'EUR' => [ + 'from' => '1999-01-01', + ], + 'ATS' => [ + 'from' => '1947-12-04', + 'to' => '2002-02-28', + ], + ], + 'AU' => [ + 'AUD' => [ + 'from' => '1966-02-14', + ], + ], + 'AW' => [ + 'AWG' => [ + 'from' => '1986-01-01', + ], + 'ANG' => [ + 'from' => '1940-05-10', + 'to' => '1986-01-01', + ], + ], + 'AX' => [ + 'EUR' => [ + 'from' => '1999-01-01', + ], + ], + 'AZ' => [ + 'AZN' => [ + 'from' => '2006-01-01', + ], + 'AZM' => [ + 'from' => '1993-11-22', + 'to' => '2006-12-31', + ], + 'RUR' => [ + 'from' => '1991-12-25', + 'to' => '1994-01-01', + ], + 'SUR' => [ + 'from' => '1961-01-01', + 'to' => '1991-12-25', + ], + ], + 'BA' => [ + 'BAM' => [ + 'from' => '1995-01-01', + ], + 'BAN' => [ + 'from' => '1994-08-15', + 'to' => '1997-07-01', + ], + 'BAD' => [ + 'from' => '1992-07-01', + 'to' => '1994-08-15', + ], + 'YUR' => [ + 'from' => '1992-07-01', + 'to' => '1993-10-01', + ], + 'YUN' => [ + 'from' => '1990-01-01', + 'to' => '1992-07-01', + ], + 'YUD' => [ + 'from' => '1966-01-01', + 'to' => '1990-01-01', + ], + ], + 'BB' => [ + 'BBD' => [ + 'from' => '1973-12-03', + ], + 'XCD' => [ + 'from' => '1965-10-06', + 'to' => '1973-12-03', + ], + ], + 'BD' => [ + 'BDT' => [ + 'from' => '1972-01-01', + ], + 'PKR' => [ + 'from' => '1948-04-01', + 'to' => '1972-01-01', + ], + 'INR' => [ + 'from' => '1835-08-17', + 'to' => '1948-04-01', + ], + ], + 'BE' => [ + 'EUR' => [ + 'from' => '1999-01-01', + ], + 'BEF' => [ + 'from' => '1831-02-07', + 'to' => '2002-02-28', + ], + 'NLG' => [ + 'from' => '1816-12-15', + 'to' => '1831-02-07', + ], + 'BEL' => [ + 'from' => '1970-01-01', + 'tender' => false, + 'to' => '1990-03-05', + ], + 'BEC' => [ + 'from' => '1970-01-01', + 'tender' => false, + 'to' => '1990-03-05', + ], + ], + 'BF' => [ + 'XOF' => [ + 'from' => '1984-08-04', + ], + ], + 'BG' => [ + 'BGN' => [ + 'from' => '1999-07-05', + ], + 'BGL' => [ + 'from' => '1962-01-01', + 'to' => '1999-07-05', + ], + 'BGM' => [ + 'from' => '1952-05-12', + 'to' => '1962-01-01', + ], + 'BGO' => [ + 'from' => '1879-07-08', + 'to' => '1952-05-12', + ], + ], + 'BH' => [ + 'BHD' => [ + 'from' => '1965-10-16', + ], + ], + 'BI' => [ + 'BIF' => [ + 'from' => '1964-05-19', + ], + ], + 'BJ' => [ + 'XOF' => [ + 'from' => '1975-11-30', + ], + ], + 'BL' => [ + 'EUR' => [ + 'from' => '1999-01-01', + ], + 'FRF' => [ + 'from' => '1960-01-01', + 'to' => '2002-02-17', + ], + ], + 'BM' => [ + 'BMD' => [ + 'from' => '1970-02-06', + ], + ], + 'BN' => [ + 'BND' => [ + 'from' => '1967-06-12', + ], + 'MYR' => [ + 'from' => '1963-09-16', + 'to' => '1967-06-12', + ], + ], + 'BO' => [ + 'BOB' => [ + 'from' => '1987-01-01', + ], + 'BOP' => [ + 'from' => '1963-01-01', + 'to' => '1986-12-31', + ], + 'BOL' => [ + 'from' => '1863-06-23', + 'to' => '1963-01-01', + ], + 'BOV' => [ + 'tender' => false, + ], + ], + 'BQ' => [ + 'USD' => [ + 'from' => '2011-01-01', + ], + 'ANG' => [ + 'from' => '2010-10-10', + 'to' => '2011-01-01', + ], + ], + 'BR' => [ + 'BRL' => [ + 'from' => '1994-07-01', + ], + 'BRR' => [ + 'from' => '1993-08-01', + 'to' => '1994-07-01', + ], + 'BRE' => [ + 'from' => '1990-03-16', + 'to' => '1993-08-01', + ], + 'BRN' => [ + 'from' => '1989-01-15', + 'to' => '1990-03-16', + ], + 'BRC' => [ + 'from' => '1986-02-28', + 'to' => '1989-01-15', + ], + 'BRB' => [ + 'from' => '1967-02-13', + 'to' => '1986-02-28', + ], + 'BRZ' => [ + 'from' => '1942-11-01', + 'to' => '1967-02-13', + ], + ], + 'BS' => [ + 'BSD' => [ + 'from' => '1966-05-25', + ], + ], + 'BT' => [ + 'BTN' => [ + 'from' => '1974-04-16', + ], + 'INR' => [ + 'from' => '1907-01-01', + ], + ], + 'BU' => [ + 'BUK' => [ + 'from' => '1952-07-01', + 'to' => '1989-06-18', + ], + ], + 'BV' => [ + 'NOK' => [ + 'from' => '1905-06-07', + ], + ], + 'BW' => [ + 'BWP' => [ + 'from' => '1976-08-23', + ], + 'ZAR' => [ + 'from' => '1961-02-14', + 'to' => '1976-08-23', + ], + ], + 'BY' => [ + 'BYN' => [ + 'from' => '2016-07-01', + ], + 'BYR' => [ + 'from' => '2000-01-01', + 'to' => '2017-01-01', + ], + 'BYB' => [ + 'from' => '1994-08-01', + 'to' => '2000-12-31', + ], + 'RUR' => [ + 'from' => '1991-12-25', + 'to' => '1994-11-08', + ], + 'SUR' => [ + 'from' => '1961-01-01', + 'to' => '1991-12-25', + ], + ], + 'BZ' => [ + 'BZD' => [ + 'from' => '1974-01-01', + ], + ], + 'CA' => [ + 'CAD' => [ + 'from' => '1858-01-01', + ], + ], + 'CC' => [ + 'AUD' => [ + 'from' => '1966-02-14', + ], + ], + 'CD' => [ + 'CDF' => [ + 'from' => '1998-07-01', + ], + 'ZRN' => [ + 'from' => '1993-11-01', + 'to' => '1998-07-01', + ], + 'ZRZ' => [ + 'from' => '1971-10-27', + 'to' => '1993-11-01', + ], + ], + 'CF' => [ + 'XAF' => [ + 'from' => '1993-01-01', + ], + ], + 'CG' => [ + 'XAF' => [ + 'from' => '1993-01-01', + ], + ], + 'CH' => [ + 'CHF' => [ + 'from' => '1799-03-17', + ], + 'CHE' => [ + 'tender' => false, + ], + 'CHW' => [ + 'tender' => false, + ], + ], + 'CI' => [ + 'XOF' => [ + 'from' => '1958-12-04', + ], + ], + 'CK' => [ + 'NZD' => [ + 'from' => '1967-07-10', + ], + ], + 'CL' => [ + 'CLP' => [ + 'from' => '1975-09-29', + ], + 'CLE' => [ + 'from' => '1960-01-01', + 'to' => '1975-09-29', + ], + 'CLF' => [ + 'tender' => false, + ], + ], + 'CM' => [ + 'XAF' => [ + 'from' => '1973-04-01', + ], + ], + 'CN' => [ + 'CNY' => [ + 'from' => '1953-03-01', + ], + 'CNX' => [ + 'from' => '1979-01-01', + 'tender' => false, + 'to' => '1998-12-31', + ], + 'CNH' => [ + 'from' => '2010-07-19', + 'tender' => false, + ], + ], + 'CO' => [ + 'COP' => [ + 'from' => '1905-01-01', + ], + 'COU' => [ + 'tender' => false, + ], + ], + 'CR' => [ + 'CRC' => [ + 'from' => '1896-10-26', + ], + ], + 'CS' => [ + 'CSD' => [ + 'from' => '2002-05-15', + 'to' => '2006-06-03', + ], + 'EUR' => [ + 'from' => '2003-02-04', + 'to' => '2006-06-03', + ], + 'YUM' => [ + 'from' => '1994-01-24', + 'to' => '2002-05-15', + ], + ], + 'CU' => [ + 'CUP' => [ + 'from' => '1859-01-01', + ], + 'CUC' => [ + 'from' => '1994-01-01', + 'to' => '2021-01-01', + ], + 'USD' => [ + 'from' => '1899-01-01', + 'to' => '1959-01-01', + ], + ], + 'CV' => [ + 'CVE' => [ + 'from' => '1914-01-01', + ], + 'PTE' => [ + 'from' => '1911-05-22', + 'to' => '1975-07-05', + ], + ], + 'CW' => [ + 'XCG' => [ + 'from' => '2025-03-31', + ], + 'ANG' => [ + 'from' => '2010-10-10', + 'to' => '2025-07-01', + ], + ], + 'CX' => [ + 'AUD' => [ + 'from' => '1966-02-14', + ], + ], + 'CY' => [ + 'EUR' => [ + 'from' => '2008-01-01', + ], + 'CYP' => [ + 'from' => '1914-09-10', + 'to' => '2008-01-31', + ], + ], + 'CZ' => [ + 'CZK' => [ + 'from' => '1993-01-01', + ], + 'CSK' => [ + 'from' => '1953-06-01', + 'to' => '1993-03-01', + ], + ], + 'DD' => [ + 'DDM' => [ + 'from' => '1948-07-20', + 'to' => '1990-10-02', + ], + ], + 'DE' => [ + 'EUR' => [ + 'from' => '1999-01-01', + ], + 'DEM' => [ + 'from' => '1948-06-20', + 'to' => '2002-02-28', + ], + ], + 'DG' => [ + 'USD' => [ + 'from' => '1965-11-08', + ], + ], + 'DJ' => [ + 'DJF' => [ + 'from' => '1977-06-27', + ], + ], + 'DK' => [ + 'DKK' => [ + 'from' => '1873-05-27', + ], + ], + 'DM' => [ + 'XCD' => [ + 'from' => '1965-10-06', + ], + ], + 'DO' => [ + 'DOP' => [ + 'from' => '1947-10-01', + ], + 'USD' => [ + 'from' => '1905-06-21', + 'to' => '1947-10-01', + ], + ], + 'DZ' => [ + 'DZD' => [ + 'from' => '1964-04-01', + ], + ], + 'EA' => [ + 'EUR' => [ + 'from' => '1999-01-01', + ], + ], + 'EC' => [ + 'USD' => [ + 'from' => '2000-10-02', + ], + 'ECS' => [ + 'from' => '1884-04-01', + 'to' => '2000-10-02', + ], + 'ECV' => [ + 'from' => '1993-05-23', + 'tender' => false, + 'to' => '2000-01-09', + ], + ], + 'EE' => [ + 'EUR' => [ + 'from' => '2011-01-01', + ], + 'EEK' => [ + 'from' => '1992-06-21', + 'to' => '2010-12-31', + ], + 'SUR' => [ + 'from' => '1961-01-01', + 'to' => '1992-06-20', + ], + ], + 'EG' => [ + 'EGP' => [ + 'from' => '1885-11-14', + ], + ], + 'EH' => [ + 'MAD' => [ + 'from' => '1976-02-26', + ], + ], + 'ER' => [ + 'ERN' => [ + 'from' => '1997-11-08', + ], + 'ETB' => [ + 'from' => '1993-05-24', + 'to' => '1997-11-08', + ], + ], + 'ES' => [ + 'EUR' => [ + 'from' => '1999-01-01', + ], + 'ESP' => [ + 'from' => '1868-10-19', + 'to' => '2002-02-28', + ], + 'ESA' => [ + 'from' => '1978-01-01', + 'tender' => false, + 'to' => '1981-12-31', + ], + 'ESB' => [ + 'from' => '1975-01-01', + 'tender' => false, + 'to' => '1994-12-31', + ], + ], + 'ET' => [ + 'ETB' => [ + 'from' => '1976-09-15', + ], + ], + 'EU' => [ + 'EUR' => [ + 'from' => '1999-01-01', + ], + 'XEU' => [ + 'from' => '1979-01-01', + 'tender' => false, + 'to' => '1998-12-31', + ], + ], + 'FI' => [ + 'EUR' => [ + 'from' => '1999-01-01', + ], + 'FIM' => [ + 'from' => '1963-01-01', + 'to' => '2002-02-28', + ], + ], + 'FJ' => [ + 'FJD' => [ + 'from' => '1969-01-13', + ], + ], + 'FK' => [ + 'FKP' => [ + 'from' => '1901-01-01', + ], + ], + 'FM' => [ + 'USD' => [ + 'from' => '1944-01-01', + ], + 'JPY' => [ + 'from' => '1914-10-03', + 'to' => '1944-01-01', + ], + ], + 'FO' => [ + 'DKK' => [ + 'from' => '1948-01-01', + ], + ], + 'FR' => [ + 'EUR' => [ + 'from' => '1999-01-01', + ], + 'FRF' => [ + 'from' => '1960-01-01', + 'to' => '2002-02-17', + ], + ], + 'GA' => [ + 'XAF' => [ + 'from' => '1993-01-01', + ], + ], + 'GB' => [ + 'GBP' => [ + 'from' => '1694-07-27', + ], + ], + 'GD' => [ + 'XCD' => [ + 'from' => '1967-02-27', + ], + ], + 'GE' => [ + 'GEL' => [ + 'from' => '1995-09-23', + ], + 'GEK' => [ + 'from' => '1993-04-05', + 'to' => '1995-09-25', + ], + 'RUR' => [ + 'from' => '1991-12-25', + 'to' => '1993-06-11', + ], + 'SUR' => [ + 'from' => '1961-01-01', + 'to' => '1991-12-25', + ], + ], + 'GF' => [ + 'EUR' => [ + 'from' => '1999-01-01', + ], + 'FRF' => [ + 'from' => '1960-01-01', + 'to' => '2002-02-17', + ], + ], + 'GG' => [ + 'GBP' => [ + 'from' => '1830-01-01', + ], + ], + 'GH' => [ + 'GHS' => [ + 'from' => '2007-07-03', + ], + 'GHC' => [ + 'from' => '1979-03-09', + 'to' => '2007-12-31', + ], + ], + 'GI' => [ + 'GIP' => [ + 'from' => '1713-01-01', + ], + ], + 'GL' => [ + 'DKK' => [ + 'from' => '1873-05-27', + ], + ], + 'GM' => [ + 'GMD' => [ + 'from' => '1971-07-01', + ], + ], + 'GN' => [ + 'GNF' => [ + 'from' => '1986-01-06', + ], + 'GNS' => [ + 'from' => '1972-10-02', + 'to' => '1986-01-06', + ], + ], + 'GP' => [ + 'EUR' => [ + 'from' => '1999-01-01', + ], + 'FRF' => [ + 'from' => '1960-01-01', + 'to' => '2002-02-17', + ], + ], + 'GQ' => [ + 'XAF' => [ + 'from' => '1993-01-01', + ], + 'GQE' => [ + 'from' => '1975-07-07', + 'to' => '1986-06-01', + ], + ], + 'GR' => [ + 'EUR' => [ + 'from' => '2001-01-01', + ], + 'GRD' => [ + 'from' => '1954-05-01', + 'to' => '2002-02-28', + ], + ], + 'GS' => [ + 'GBP' => [ + 'from' => '1908-01-01', + ], + ], + 'GT' => [ + 'GTQ' => [ + 'from' => '1925-05-27', + ], + ], + 'GU' => [ + 'USD' => [ + 'from' => '1944-08-21', + ], + ], + 'GW' => [ + 'XOF' => [ + 'from' => '1997-03-31', + ], + 'GWP' => [ + 'from' => '1976-02-28', + 'to' => '1997-03-31', + ], + 'GWE' => [ + 'from' => '1914-01-01', + 'to' => '1976-02-28', + ], + ], + 'GY' => [ + 'GYD' => [ + 'from' => '1966-05-26', + ], + ], + 'HK' => [ + 'HKD' => [ + 'from' => '1895-02-02', + ], + ], + 'HM' => [ + 'AUD' => [ + 'from' => '1967-02-16', + ], + ], + 'HN' => [ + 'HNL' => [ + 'from' => '1926-04-03', + ], + ], + 'HR' => [ + 'EUR' => [ + 'from' => '2022-12-31', + ], + 'HRK' => [ + 'from' => '1994-05-30', + 'to' => '2023-01-14', + ], + 'HRD' => [ + 'from' => '1991-12-23', + 'to' => '1995-01-01', + ], + 'YUN' => [ + 'from' => '1990-01-01', + 'to' => '1991-12-23', + ], + 'YUD' => [ + 'from' => '1966-01-01', + 'to' => '1990-01-01', + ], + ], + 'HT' => [ + 'HTG' => [ + 'from' => '1872-08-26', + ], + 'USD' => [ + 'from' => '1915-01-01', + ], + ], + 'HU' => [ + 'HUF' => [ + 'from' => '1946-07-23', + ], + ], + 'IC' => [ + 'EUR' => [ + 'from' => '1999-01-01', + ], + ], + 'ID' => [ + 'IDR' => [ + 'from' => '1965-12-13', + ], + ], + 'IE' => [ + 'EUR' => [ + 'from' => '1999-01-01', + ], + 'IEP' => [ + 'from' => '1922-01-01', + 'to' => '2002-02-09', + ], + 'GBP' => [ + 'from' => '1800-01-01', + 'to' => '1922-01-01', + ], + ], + 'IL' => [ + 'ILS' => [ + 'from' => '1985-09-04', + ], + 'ILR' => [ + 'from' => '1980-02-22', + 'to' => '1985-09-04', + ], + 'ILP' => [ + 'from' => '1948-08-16', + 'to' => '1980-02-22', + ], + ], + 'IM' => [ + 'GBP' => [ + 'from' => '1840-01-03', + ], + ], + 'IN' => [ + 'INR' => [ + 'from' => '1835-08-17', + ], + ], + 'IO' => [ + 'USD' => [ + 'from' => '1965-11-08', + ], + ], + 'IQ' => [ + 'IQD' => [ + 'from' => '1931-04-19', + ], + 'EGP' => [ + 'from' => '1920-11-11', + 'to' => '1931-04-19', + ], + 'INR' => [ + 'from' => '1920-11-11', + 'to' => '1931-04-19', + ], + ], + 'IR' => [ + 'IRR' => [ + 'from' => '1932-05-13', + ], + ], + 'IS' => [ + 'ISK' => [ + 'from' => '1981-01-01', + ], + 'ISJ' => [ + 'from' => '1918-12-01', + 'to' => '1981-01-01', + ], + 'DKK' => [ + 'from' => '1873-05-27', + 'to' => '1918-12-01', + ], + ], + 'IT' => [ + 'EUR' => [ + 'from' => '1999-01-01', + ], + 'ITL' => [ + 'from' => '1862-08-24', + 'to' => '2002-02-28', + ], + ], + 'JE' => [ + 'GBP' => [ + 'from' => '1837-01-01', + ], + ], + 'JM' => [ + 'JMD' => [ + 'from' => '1969-09-08', + ], + ], + 'JO' => [ + 'JOD' => [ + 'from' => '1950-07-01', + ], + ], + 'JP' => [ + 'JPY' => [ + 'from' => '1871-06-01', + ], + ], + 'KE' => [ + 'KES' => [ + 'from' => '1966-09-14', + ], + ], + 'KG' => [ + 'KGS' => [ + 'from' => '1993-05-10', + ], + 'RUR' => [ + 'from' => '1991-12-25', + 'to' => '1993-05-10', + ], + 'SUR' => [ + 'from' => '1961-01-01', + 'to' => '1991-12-25', + ], + ], + 'KH' => [ + 'KHR' => [ + 'from' => '1980-03-20', + ], + ], + 'KI' => [ + 'AUD' => [ + 'from' => '1966-02-14', + ], + ], + 'KM' => [ + 'KMF' => [ + 'from' => '1975-07-06', + ], + ], + 'KN' => [ + 'XCD' => [ + 'from' => '1965-10-06', + ], + ], + 'KP' => [ + 'KPW' => [ + 'from' => '1959-04-17', + ], + ], + 'KR' => [ + 'KRW' => [ + 'from' => '1962-06-10', + ], + 'KRH' => [ + 'from' => '1953-02-15', + 'to' => '1962-06-10', + ], + 'KRO' => [ + 'from' => '1945-08-15', + 'to' => '1953-02-15', + ], + ], + 'KW' => [ + 'KWD' => [ + 'from' => '1961-04-01', + ], + ], + 'KY' => [ + 'KYD' => [ + 'from' => '1971-01-01', + ], + 'JMD' => [ + 'from' => '1969-09-08', + 'to' => '1971-01-01', + ], + ], + 'KZ' => [ + 'KZT' => [ + 'from' => '1993-11-05', + ], + ], + 'LA' => [ + 'LAK' => [ + 'from' => '1979-12-10', + ], + ], + 'LB' => [ + 'LBP' => [ + 'from' => '1948-02-02', + ], + ], + 'LC' => [ + 'XCD' => [ + 'from' => '1965-10-06', + ], + ], + 'LI' => [ + 'CHF' => [ + 'from' => '1921-02-01', + ], + ], + 'LK' => [ + 'LKR' => [ + 'from' => '1978-05-22', + ], + ], + 'LR' => [ + 'LRD' => [ + 'from' => '1944-01-01', + ], + ], + 'LS' => [ + 'ZAR' => [ + 'from' => '1961-02-14', + ], + 'LSL' => [ + 'from' => '1980-01-22', + ], + ], + 'LT' => [ + 'EUR' => [ + 'from' => '2015-01-01', + ], + 'LTL' => [ + 'from' => '1993-06-25', + 'to' => '2014-12-31', + ], + 'LTT' => [ + 'from' => '1992-10-01', + 'to' => '1993-06-25', + ], + 'SUR' => [ + 'from' => '1961-01-01', + 'to' => '1992-10-01', + ], + ], + 'LU' => [ + 'EUR' => [ + 'from' => '1999-01-01', + ], + 'LUF' => [ + 'from' => '1944-09-04', + 'to' => '2002-02-28', + ], + 'LUC' => [ + 'from' => '1970-01-01', + 'tender' => false, + 'to' => '1990-03-05', + ], + 'LUL' => [ + 'from' => '1970-01-01', + 'tender' => false, + 'to' => '1990-03-05', + ], + ], + 'LV' => [ + 'EUR' => [ + 'from' => '2014-01-01', + ], + 'LVL' => [ + 'from' => '1993-06-28', + 'to' => '2013-12-31', + ], + 'LVR' => [ + 'from' => '1992-05-07', + 'to' => '1993-10-17', + ], + 'SUR' => [ + 'from' => '1961-01-01', + 'to' => '1992-07-20', + ], + ], + 'LY' => [ + 'LYD' => [ + 'from' => '1971-09-01', + ], + ], + 'MA' => [ + 'MAD' => [ + 'from' => '1959-10-17', + ], + 'MAF' => [ + 'from' => '1881-01-01', + 'to' => '1959-10-17', + ], + ], + 'MC' => [ + 'EUR' => [ + 'from' => '1999-01-01', + ], + 'FRF' => [ + 'from' => '1960-01-01', + 'to' => '2002-02-17', + ], + 'MCF' => [ + 'from' => '1960-01-01', + 'to' => '2002-02-17', + ], + ], + 'MD' => [ + 'MDL' => [ + 'from' => '1993-11-29', + ], + 'MDC' => [ + 'from' => '1992-06-01', + 'to' => '1993-11-29', + ], + ], + 'ME' => [ + 'EUR' => [ + 'from' => '2002-01-01', + ], + 'DEM' => [ + 'from' => '1999-10-02', + 'to' => '2002-05-15', + ], + 'YUM' => [ + 'from' => '1994-01-24', + 'to' => '2002-05-15', + ], + ], + 'MF' => [ + 'EUR' => [ + 'from' => '1999-01-01', + ], + 'FRF' => [ + 'from' => '1960-01-01', + 'to' => '2002-02-17', + ], + ], + 'MG' => [ + 'MGA' => [ + 'from' => '1983-11-01', + ], + 'MGF' => [ + 'from' => '1963-07-01', + 'to' => '2004-12-31', + ], + ], + 'MH' => [ + 'USD' => [ + 'from' => '1944-01-01', + ], + ], + 'MK' => [ + 'MKD' => [ + 'from' => '1993-05-20', + ], + 'MKN' => [ + 'from' => '1992-04-26', + 'to' => '1993-05-20', + ], + ], + 'ML' => [ + 'XOF' => [ + 'from' => '1958-11-24', + 'to' => '1962-07-02', + ], + 'MLF' => [ + 'from' => '1962-07-02', + 'to' => '1984-08-31', + ], + ], + 'MM' => [ + 'MMK' => [ + 'from' => '1989-06-18', + ], + 'BUK' => [ + 'from' => '1952-07-01', + 'to' => '1989-06-18', + ], + ], + 'MN' => [ + 'MNT' => [ + 'from' => '1915-03-01', + ], + ], + 'MO' => [ + 'MOP' => [ + 'from' => '1901-01-01', + ], + ], + 'MP' => [ + 'USD' => [ + 'from' => '1944-01-01', + ], + ], + 'MQ' => [ + 'EUR' => [ + 'from' => '1999-01-01', + ], + 'FRF' => [ + 'from' => '1960-01-01', + 'to' => '2002-02-17', + ], + ], + 'MR' => [ + 'MRU' => [ + 'from' => '2018-01-01', + ], + 'MRO' => [ + 'from' => '1973-06-29', + 'to' => '2018-06-30', + ], + 'XOF' => [ + 'from' => '1958-11-28', + 'to' => '1973-06-29', + ], + ], + 'MS' => [ + 'XCD' => [ + 'from' => '1967-02-27', + ], + ], + 'MT' => [ + 'EUR' => [ + 'from' => '2008-01-01', + ], + 'MTL' => [ + 'from' => '1968-06-07', + 'to' => '2008-01-31', + ], + 'MTP' => [ + 'from' => '1914-08-13', + 'to' => '1968-06-07', + ], + ], + 'MU' => [ + 'MUR' => [ + 'from' => '1934-04-01', + ], + ], + 'MV' => [ + 'MVR' => [ + 'from' => '1981-07-01', + ], + 'MVP' => [ + 'from' => '1947-01-01', + 'to' => '1981-07-01', + ], + ], + 'MW' => [ + 'MWK' => [ + 'from' => '1971-02-15', + ], + ], + 'MX' => [ + 'MXN' => [ + 'from' => '1993-01-01', + ], + 'MXP' => [ + 'from' => '1822-01-01', + 'to' => '1992-12-31', + ], + 'MXV' => [ + 'tender' => false, + ], + ], + 'MY' => [ + 'MYR' => [ + 'from' => '1963-09-16', + ], + ], + 'MZ' => [ + 'MZN' => [ + 'from' => '2006-07-01', + ], + 'MZM' => [ + 'from' => '1980-06-16', + 'to' => '2006-12-31', + ], + 'MZE' => [ + 'from' => '1975-06-25', + 'to' => '1980-06-16', + ], + ], + 'NA' => [ + 'NAD' => [ + 'from' => '1993-01-01', + ], + 'ZAR' => [ + 'from' => '1961-02-14', + ], + ], + 'NC' => [ + 'XPF' => [ + 'from' => '1985-01-01', + ], + ], + 'NE' => [ + 'XOF' => [ + 'from' => '1958-12-19', + ], + ], + 'NF' => [ + 'AUD' => [ + 'from' => '1966-02-14', + ], + ], + 'NG' => [ + 'NGN' => [ + 'from' => '1973-01-01', + ], + ], + 'NI' => [ + 'NIO' => [ + 'from' => '1991-04-30', + ], + 'NIC' => [ + 'from' => '1988-02-15', + 'to' => '1991-04-30', + ], + ], + 'NL' => [ + 'EUR' => [ + 'from' => '1999-01-01', + ], + 'NLG' => [ + 'from' => '1813-01-01', + 'to' => '2002-02-28', + ], + ], + 'NO' => [ + 'NOK' => [ + 'from' => '1905-06-07', + ], + 'SEK' => [ + 'from' => '1873-05-27', + 'to' => '1905-06-07', + ], + ], + 'NP' => [ + 'NPR' => [ + 'from' => '1933-01-01', + ], + 'INR' => [ + 'from' => '1870-01-01', + 'to' => '1966-10-17', + ], + ], + 'NR' => [ + 'AUD' => [ + 'from' => '1966-02-14', + ], + ], + 'NU' => [ + 'NZD' => [ + 'from' => '1967-07-10', + ], + ], + 'NZ' => [ + 'NZD' => [ + 'from' => '1967-07-10', + ], + ], + 'OM' => [ + 'OMR' => [ + 'from' => '1972-11-11', + ], + ], + 'PA' => [ + 'PAB' => [ + 'from' => '1903-11-04', + ], + 'USD' => [ + 'from' => '1903-11-18', + ], + ], + 'PE' => [ + 'PEN' => [ + 'from' => '1991-07-01', + ], + 'PEI' => [ + 'from' => '1985-02-01', + 'to' => '1991-07-01', + ], + 'PES' => [ + 'from' => '1863-02-14', + 'to' => '1985-02-01', + ], + ], + 'PF' => [ + 'XPF' => [ + 'from' => '1945-12-26', + ], + ], + 'PG' => [ + 'PGK' => [ + 'from' => '1975-09-16', + ], + 'AUD' => [ + 'from' => '1966-02-14', + 'to' => '1975-09-16', + ], + ], + 'PH' => [ + 'PHP' => [ + 'from' => '1946-07-04', + ], + ], + 'PK' => [ + 'PKR' => [ + 'from' => '1948-04-01', + ], + 'INR' => [ + 'from' => '1835-08-17', + 'to' => '1947-08-15', + ], + ], + 'PL' => [ + 'PLN' => [ + 'from' => '1995-01-01', + ], + 'PLZ' => [ + 'from' => '1950-10-28', + 'to' => '1994-12-31', + ], + ], + 'PM' => [ + 'EUR' => [ + 'from' => '1999-01-01', + ], + 'FRF' => [ + 'from' => '1972-12-21', + 'to' => '2002-02-17', + ], + ], + 'PN' => [ + 'NZD' => [ + 'from' => '1969-01-13', + ], + ], + 'PR' => [ + 'USD' => [ + 'from' => '1898-12-10', + ], + 'ESP' => [ + 'from' => '1800-01-01', + 'to' => '1898-12-10', + ], + ], + 'PS' => [ + 'ILS' => [ + 'from' => '1985-09-04', + ], + 'JOD' => [ + 'from' => '1950-07-01', + 'to' => '1967-06-01', + ], + 'ILP' => [ + 'from' => '1967-06-01', + 'to' => '1980-02-22', + ], + ], + 'PT' => [ + 'EUR' => [ + 'from' => '1999-01-01', + ], + 'PTE' => [ + 'from' => '1911-05-22', + 'to' => '2002-02-28', + ], + ], + 'PW' => [ + 'USD' => [ + 'from' => '1944-01-01', + ], + ], + 'PY' => [ + 'PYG' => [ + 'from' => '1943-11-01', + ], + ], + 'QA' => [ + 'QAR' => [ + 'from' => '1973-05-19', + ], + ], + 'RE' => [ + 'EUR' => [ + 'from' => '1999-01-01', + ], + 'FRF' => [ + 'from' => '1975-01-01', + 'to' => '2002-02-17', + ], + ], + 'RO' => [ + 'RON' => [ + 'from' => '2005-07-01', + ], + 'ROL' => [ + 'from' => '1952-01-28', + 'to' => '2006-12-31', + ], + ], + 'RS' => [ + 'RSD' => [ + 'from' => '2006-10-25', + ], + 'CSD' => [ + 'from' => '2002-05-15', + 'to' => '2006-10-25', + ], + 'YUM' => [ + 'from' => '1994-01-24', + 'to' => '2002-05-15', + ], + ], + 'RU' => [ + 'RUB' => [ + 'from' => '1999-01-01', + ], + 'RUR' => [ + 'from' => '1991-12-25', + 'to' => '1998-12-31', + ], + ], + 'RW' => [ + 'RWF' => [ + 'from' => '1964-05-19', + ], + ], + 'SA' => [ + 'SAR' => [ + 'from' => '1952-10-22', + ], + ], + 'SB' => [ + 'SBD' => [ + 'from' => '1977-10-24', + ], + 'AUD' => [ + 'from' => '1966-02-14', + 'to' => '1978-06-30', + ], + ], + 'SC' => [ + 'SCR' => [ + 'from' => '1903-11-01', + ], + ], + 'SD' => [ + 'SDG' => [ + 'from' => '2007-01-10', + ], + 'SDD' => [ + 'from' => '1992-06-08', + 'to' => '2007-06-30', + ], + 'SDP' => [ + 'from' => '1957-04-08', + 'to' => '1998-06-01', + ], + 'EGP' => [ + 'from' => '1889-01-19', + 'to' => '1958-01-01', + ], + 'GBP' => [ + 'from' => '1889-01-19', + 'to' => '1958-01-01', + ], + ], + 'SE' => [ + 'SEK' => [ + 'from' => '1873-05-27', + ], + ], + 'SG' => [ + 'SGD' => [ + 'from' => '1967-06-12', + ], + 'MYR' => [ + 'from' => '1963-09-16', + 'to' => '1967-06-12', + ], + ], + 'SH' => [ + 'SHP' => [ + 'from' => '1917-02-15', + ], + ], + 'SI' => [ + 'EUR' => [ + 'from' => '2007-01-01', + ], + 'SIT' => [ + 'from' => '1992-10-07', + 'to' => '2007-01-14', + ], + ], + 'SJ' => [ + 'NOK' => [ + 'from' => '1905-06-07', + ], + ], + 'SK' => [ + 'EUR' => [ + 'from' => '2009-01-01', + ], + 'SKK' => [ + 'from' => '1992-12-31', + 'to' => '2009-01-01', + ], + 'CSK' => [ + 'from' => '1953-06-01', + 'to' => '1992-12-31', + ], + ], + 'SL' => [ + 'SLE' => [ + 'from' => '2022-07-01', + ], + 'SLL' => [ + 'from' => '1964-08-04', + 'to' => '2023-12-31', + ], + 'GBP' => [ + 'from' => '1808-11-30', + 'to' => '1966-02-04', + ], + ], + 'SM' => [ + 'EUR' => [ + 'from' => '1999-01-01', + ], + 'ITL' => [ + 'from' => '1865-12-23', + 'to' => '2001-02-28', + ], + ], + 'SN' => [ + 'XOF' => [ + 'from' => '1959-04-04', + ], + ], + 'SO' => [ + 'SOS' => [ + 'from' => '1960-07-01', + ], + ], + 'SR' => [ + 'SRD' => [ + 'from' => '2004-01-01', + ], + 'SRG' => [ + 'from' => '1940-05-10', + 'to' => '2003-12-31', + ], + 'NLG' => [ + 'from' => '1815-11-20', + 'to' => '1940-05-10', + ], + ], + 'SS' => [ + 'SSP' => [ + 'from' => '2011-07-18', + ], + 'SDG' => [ + 'from' => '2007-01-10', + 'to' => '2011-09-01', + ], + ], + 'ST' => [ + 'STN' => [ + 'from' => '2018-01-01', + ], + 'STD' => [ + 'from' => '1977-09-08', + 'to' => '2017-12-31', + ], + ], + 'SU' => [ + 'SUR' => [ + 'from' => '1961-01-01', + 'to' => '1991-12-25', + ], + ], + 'SV' => [ + 'USD' => [ + 'from' => '2001-01-01', + ], + 'SVC' => [ + 'from' => '1919-11-11', + 'to' => '2001-01-01', + ], + ], + 'SX' => [ + 'XCG' => [ + 'from' => '2025-03-31', + ], + 'ANG' => [ + 'from' => '2010-10-10', + 'to' => '2025-07-01', + ], + ], + 'SY' => [ + 'SYP' => [ + 'from' => '1948-01-01', + ], + ], + 'SZ' => [ + 'SZL' => [ + 'from' => '1974-09-06', + ], + ], + 'TA' => [ + 'GBP' => [ + 'from' => '1938-01-12', + ], + ], + 'TC' => [ + 'USD' => [ + 'from' => '1969-09-08', + ], + ], + 'TD' => [ + 'XAF' => [ + 'from' => '1993-01-01', + ], + ], + 'TF' => [ + 'EUR' => [ + 'from' => '1999-01-01', + ], + 'FRF' => [ + 'from' => '1959-01-01', + 'to' => '2002-02-17', + ], + ], + 'TG' => [ + 'XOF' => [ + 'from' => '1958-11-28', + ], + ], + 'TH' => [ + 'THB' => [ + 'from' => '1928-04-15', + ], + ], + 'TJ' => [ + 'TJS' => [ + 'from' => '2000-10-26', + ], + 'TJR' => [ + 'from' => '1995-05-10', + 'to' => '2000-10-25', + ], + 'RUR' => [ + 'from' => '1991-12-25', + 'to' => '1995-05-10', + ], + ], + 'TK' => [ + 'NZD' => [ + 'from' => '1967-07-10', + ], + ], + 'TL' => [ + 'USD' => [ + 'from' => '1999-10-20', + ], + 'TPE' => [ + 'from' => '1959-01-02', + 'to' => '2002-05-20', + ], + 'IDR' => [ + 'from' => '1975-12-07', + 'to' => '2002-05-20', + ], + ], + 'TM' => [ + 'TMT' => [ + 'from' => '2009-01-01', + ], + 'TMM' => [ + 'from' => '1993-11-01', + 'to' => '2009-01-01', + ], + 'RUR' => [ + 'from' => '1991-12-25', + 'to' => '1993-11-01', + ], + 'SUR' => [ + 'from' => '1961-01-01', + 'to' => '1991-12-25', + ], + ], + 'TN' => [ + 'TND' => [ + 'from' => '1958-11-01', + ], + ], + 'TO' => [ + 'TOP' => [ + 'from' => '1966-02-14', + ], + ], + 'TP' => [ + 'TPE' => [ + 'from' => '1959-01-02', + 'to' => '2002-05-20', + ], + 'IDR' => [ + 'from' => '1975-12-07', + 'to' => '2002-05-20', + ], + ], + 'TR' => [ + 'TRY' => [ + 'from' => '2005-01-01', + ], + 'TRL' => [ + 'from' => '1922-11-01', + 'to' => '2005-12-31', + ], + ], + 'TT' => [ + 'TTD' => [ + 'from' => '1964-01-01', + ], + ], + 'TV' => [ + 'AUD' => [ + 'from' => '1966-02-14', + ], + ], + 'TW' => [ + 'TWD' => [ + 'from' => '1949-06-15', + ], + ], + 'TZ' => [ + 'TZS' => [ + 'from' => '1966-06-14', + ], + ], + 'UA' => [ + 'UAH' => [ + 'from' => '1996-09-02', + ], + 'UAK' => [ + 'from' => '1992-11-13', + 'to' => '1993-10-17', + ], + 'RUR' => [ + 'from' => '1991-12-25', + 'to' => '1992-11-13', + ], + 'SUR' => [ + 'from' => '1961-01-01', + 'to' => '1991-12-25', + ], + ], + 'UG' => [ + 'UGX' => [ + 'from' => '1987-05-15', + ], + 'UGS' => [ + 'from' => '1966-08-15', + 'to' => '1987-05-15', + ], + ], + 'UM' => [ + 'USD' => [ + 'from' => '1944-01-01', + ], + ], + 'US' => [ + 'USD' => [ + 'from' => '1792-01-01', + ], + 'USN' => [ + 'tender' => false, + ], + 'USS' => [ + 'tender' => false, + 'to' => '2014-03-01', + ], + ], + 'UY' => [ + 'UYU' => [ + 'from' => '1993-03-01', + ], + 'UYP' => [ + 'from' => '1975-07-01', + 'to' => '1993-03-01', + ], + 'UYI' => [ + 'tender' => false, + ], + 'UYW' => [ + 'tender' => false, + ], + ], + 'UZ' => [ + 'UZS' => [ + 'from' => '1994-07-01', + ], + ], + 'VA' => [ + 'EUR' => [ + 'from' => '1999-01-01', + ], + 'ITL' => [ + 'from' => '1870-10-19', + 'to' => '2002-02-28', + ], + ], + 'VC' => [ + 'XCD' => [ + 'from' => '1965-10-06', + ], + ], + 'VE' => [ + 'VES' => [ + 'from' => '2018-08-20', + ], + 'VEF' => [ + 'from' => '2008-01-01', + 'to' => '2018-08-20', + ], + 'VEB' => [ + 'from' => '1871-05-11', + 'to' => '2008-06-30', + ], + 'VED' => [ + 'tender' => false, + ], + ], + 'VG' => [ + 'USD' => [ + 'from' => '1833-01-01', + ], + 'GBP' => [ + 'from' => '1833-01-01', + 'to' => '1959-01-01', + ], + ], + 'VI' => [ + 'USD' => [ + 'from' => '1837-01-01', + ], + ], + 'VN' => [ + 'VND' => [ + 'from' => '1985-09-14', + ], + 'VNN' => [ + 'from' => '1978-05-03', + 'to' => '1985-09-14', + ], + ], + 'VU' => [ + 'VUV' => [ + 'from' => '1981-01-01', + ], + ], + 'WF' => [ + 'XPF' => [ + 'from' => '1961-07-30', + ], + ], + 'WS' => [ + 'WST' => [ + 'from' => '1967-07-10', + ], + ], + 'XK' => [ + 'EUR' => [ + 'from' => '2002-01-01', + ], + 'DEM' => [ + 'from' => '1999-09-01', + 'to' => '2002-03-09', + ], + 'YUM' => [ + 'from' => '1994-01-24', + 'to' => '1999-09-30', + ], + ], + 'YD' => [ + 'YDD' => [ + 'from' => '1965-04-01', + 'to' => '1996-01-01', + ], + ], + 'YE' => [ + 'YER' => [ + 'from' => '1990-05-22', + ], + ], + 'YT' => [ + 'EUR' => [ + 'from' => '1999-01-01', + ], + 'FRF' => [ + 'from' => '1976-02-23', + 'to' => '2002-02-17', + ], + 'KMF' => [ + 'from' => '1975-01-01', + 'to' => '1976-02-23', + ], + ], + 'YU' => [ + 'YUM' => [ + 'from' => '1994-01-24', + 'to' => '2002-05-15', + ], + 'YUN' => [ + 'from' => '1990-01-01', + 'to' => '1992-07-24', + ], + 'YUD' => [ + 'from' => '1966-01-01', + 'to' => '1990-01-01', + ], + ], + 'ZA' => [ + 'ZAR' => [ + 'from' => '1961-02-14', + ], + 'ZAL' => [ + 'from' => '1985-09-01', + 'tender' => false, + 'to' => '1995-03-13', + ], + ], + 'ZM' => [ + 'ZMW' => [ + 'from' => '2013-01-01', + ], + 'ZMK' => [ + 'from' => '1968-01-16', + 'to' => '2013-01-01', + ], + ], + 'ZR' => [ + 'ZRN' => [ + 'from' => '1993-11-01', + 'to' => '1998-07-31', + ], + 'ZRZ' => [ + 'from' => '1971-10-27', + 'to' => '1993-11-01', + ], + ], + 'ZW' => [ + 'ZWG' => [ + 'from' => '2024-06-25', + ], + 'USD' => [ + 'from' => '2009-04-12', + ], + 'ZWL' => [ + 'from' => '2009-02-02', + 'to' => '2024-08-31', + ], + 'ZWR' => [ + 'from' => '2008-08-01', + 'to' => '2009-02-02', + ], + 'ZWD' => [ + 'from' => '1980-04-18', + 'to' => '2008-08-01', + ], + 'RHD' => [ + 'from' => '1970-02-17', + 'to' => '1980-04-18', + ], + ], + 'ZZ' => [ + 'XFO' => [ + 'from' => '1930-01-01', + 'tender' => false, + 'to' => '2003-04-01', + ], + 'XFU' => [ + 'tender' => false, + 'to' => '2013-11-30', + ], + 'XRE' => [ + 'tender' => false, + 'to' => '1999-11-30', + ], + ], + ], 'Alpha3ToNumeric' => [ 'AFA' => 4, 'ALK' => 8, diff --git a/src/Symfony/Component/Intl/Tests/CurrenciesTest.php b/src/Symfony/Component/Intl/Tests/CurrenciesTest.php index 35261a0c34c35..232e4cdd290e2 100644 --- a/src/Symfony/Component/Intl/Tests/CurrenciesTest.php +++ b/src/Symfony/Component/Intl/Tests/CurrenciesTest.php @@ -805,4 +805,23 @@ private static function getNumericToAlpha3Mapping() return $numericToAlpha3; } + + public function testExistsInAtLeastOneCountry() + { + $this->assertFalse(Currencies::existsInAtLeastOneCountry('BEF', date: '2025-08-15')); + $this->assertTrue(Currencies::existsInAtLeastOneCountry('USD', date: '2025-08-15')); + } + + public function testForCountry() + { + $expected = [ + 'CHF' => [ + 'from' => '1799-03-17', + ], + ]; + + $actual = Currencies::forCountry('CH', date: '2025-08-15'); + + $this->assertSame($expected, $actual); + } }