From 87386235c22a6dcd09f17cbeaa094152ccfd8540 Mon Sep 17 00:00:00 2001 From: Chen Asraf Date: Thu, 5 Dec 2024 00:23:33 +0200 Subject: [PATCH] feat: improve currency matching --- .github/workflows/release.yml | 2 +- README.md | 21 +- appinfo/info.xml | 29 +- lib/Service/FetchCurrenciesService.php | 48 +- lib/Service/symbols.json | 1001 ++++++++++++++++++++++++ 5 files changed, 1053 insertions(+), 48 deletions(-) create mode 100644 lib/Service/symbols.json diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 21ec032..3a7bc86 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,7 +14,7 @@ permissions: pull-requests: write concurrency: - group: lint-php-cs-${{ github.head_ref || github.run_id }} + group: release-${{ github.head_ref || github.run_id }} cancel-in-progress: true jobs: diff --git a/README.md b/README.md index 0fce4b4..af8e195 100755 --- a/README.md +++ b/README.md @@ -13,25 +13,18 @@ rate. Interval for fetch may be adjusted in the admin settings "Auto Currency" section. +**Note**: This is a companion app to Cospend. Without Cospend, this app will not work. + ## Preparing currency data -To make this work, a 3-letter currency code must be in the name of the currency. +For both main and additional currencies, you must include in the currency name, one of the following: -Currencies of different code lengths are not currently supported (but are planned). +- Currency symbol (`$`, `€`, `£`, etc.) +- Currency code (USD, EUR, GBP, etc.) - case insensitive -The currency code will be fetched using the first 3-uppercase-letter occurrence in the name defined -on Cospend. +Using one of these will be enough to fetch the correct rate. -For example, to properly set USD as currency, set the name to one of (but not limited to): - -- USD -- $ USD -- USD $ -- United States Dollars (USD) - -Will all be considered "USD" for conversion purposes. - -This rule applies to **main** and **additional currencies**. +For a list of available currencies, see [currencies.json](lib/Service/symbols.json). To see the full list of available currencies, visit [this page](https://cdn.jsdelivr.net/npm/@fawazahmed0/currency-api@latest/v1/currencies.json) and diff --git a/appinfo/info.xml b/appinfo/info.xml index 52e2674..41bcc2c 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -10,33 +10,12 @@ - Buy Me a Coffee at ko-fi.com - - -I welcome any issues or pull requests on GitHub. If you find a bug, or would like a new feature, -don't hesitate to open an appropriate issue and I will do my best to reply promptly.]]> +**Note**: This is a companion app to Cospend. Without Cospend, this app will not work.]]> 0.2.1 agpl Chen Asraf diff --git a/lib/Service/FetchCurrenciesService.php b/lib/Service/FetchCurrenciesService.php index 6e3ab11..5c14897 100644 --- a/lib/Service/FetchCurrenciesService.php +++ b/lib/Service/FetchCurrenciesService.php @@ -19,11 +19,19 @@ use Psr\Log\LoggerInterface; class FetchCurrenciesService { private static $EXCHANGE_URL = 'https://cdn.jsdelivr.net/npm/@fawazahmed0/currency-api@latest/v1/currencies/{base}.json'; + private static $SYMBOLS_FILE = __DIR__ . '/symbols.json'; + private IAppConfig $config; + private CurrencyMapper $currencyMapper; + private CospendProjectMapper $projectMapper; + private LoggerInterface $logger; + /* @var array> */ + private array $symbols; + public function __construct( IAppConfig $config, CurrencyMapper $currencyMapper, @@ -34,6 +42,7 @@ class FetchCurrenciesService { $this->currencyMapper = $currencyMapper; $this->projectMapper = $projectMapper; $this->logger = $logger; + $this->loadSymbols(); } public function fetchCurrencyRates(): void { @@ -68,8 +77,13 @@ class FetchCurrenciesService { foreach ($currencies as $currency) { $cur = $this->getCurrencyName($currency->getName()); + if ($cur === null) { + $this->logger->error('Currency not found: ' . $currency->getName()); + continue; + } $lcur = strtolower($cur); - $newRate = floatval(number_format(1 / $json[$lbase][$lcur], 2)); + $baseRate = $json[$lbase][$lcur]; + $newRate = floatval(number_format(1 / $baseRate, 2)); $currency->setExchangeRate($newRate); $this->logger->info('Setting exchange rate for currency ' . $cur . ' to ' . $newRate); $this->currencyMapper->update($currency); @@ -80,17 +94,35 @@ class FetchCurrenciesService { $this->config->setValueString('autocurrency', 'last_update', $lastUpdate); } - private function getCurrencyName(string $name): string { - // find 3-letter currency code for the base currency - preg_match('/([A-Z]{3})/', $name, $matches); + /** Match the currency name from the known currencies. **/ + private function getCurrencyName(string $name): ?string { + foreach ($this->symbols as $cur => $currency) { + // e.g. usd + $id = strtolower($cur); + if (strtolower($name) === $id) { + return $id; + } - $this->logger->info('Matches: ' . json_encode($matches)); + // e.g. $ + $symbol = $currency['symbol']; + if (str_contains($name, $symbol)) { + return $id; + } - if (count($matches) === 2) { - $name = $matches[1]; + // e.g. $ USD + preg_match('/\b' . $id . '\b/', strtolower($name), $matches); + if (count($matches) > 0) { + return $id; + } } - return $name; + return null; + } + + /** Load symbols from the symbols.json file */ + private function loadSymbols(): void { + $this->symbols = json_decode(file_get_contents(FetchCurrenciesService::$SYMBOLS_FILE), true); + $this->logger->info('Loaded symbols: ' . json_encode($this->symbols)); } /** diff --git a/lib/Service/symbols.json b/lib/Service/symbols.json new file mode 100644 index 0000000..fcaa667 --- /dev/null +++ b/lib/Service/symbols.json @@ -0,0 +1,1001 @@ +{ + "JOD":{ + "symbol":"JD", + "name":"Jordanian Dinar", + "symbol_native":"د.أ.‏", + "decimal_digits":3, + "rounding":0, + "code":"JOD", + "name_plural":"Jordanian dinars" + }, + "COP":{ + "symbol":"CO$", + "name":"Colombian Peso", + "symbol_native":"$", + "decimal_digits":0, + "rounding":0, + "code":"COP", + "name_plural":"Colombian pesos" + }, + "JPY":{ + "symbol":"¥", + "name":"Japanese Yen", + "symbol_native":"¥", + "decimal_digits":0, + "rounding":0, + "code":"JPY", + "name_plural":"Japanese yen" + }, + "TZS":{ + "symbol":"TSh", + "name":"Tanzanian Shilling", + "symbol_native":"TSh", + "decimal_digits":0, + "rounding":0, + "code":"TZS", + "name_plural":"Tanzanian shillings" + }, + "TTD":{ + "symbol":"TT$", + "name":"Trinidad and Tobago Dollar", + "symbol_native":"$", + "decimal_digits":2, + "rounding":0, + "code":"TTD", + "name_plural":"Trinidad and Tobago dollars" + }, + "XOF":{ + "symbol":"CFA", + "name":"CFA Franc BCEAO", + "symbol_native":"CFA", + "decimal_digits":0, + "rounding":0, + "code":"XOF", + "name_plural":"CFA francs BCEAO" + }, + "ILS":{ + "symbol":"₪", + "name":"Israeli New Sheqel", + "symbol_native":"₪", + "decimal_digits":2, + "rounding":0, + "code":"ILS", + "name_plural":"Israeli new sheqels" + }, + "AFN":{ + "symbol":"Af", + "name":"Afghan Afghani", + "symbol_native":"؋", + "decimal_digits":0, + "rounding":0, + "code":"AFN", + "name_plural":"Afghan Afghanis" + }, + "BGN":{ + "symbol":"BGN", + "name":"Bulgarian Lev", + "symbol_native":"лв.", + "decimal_digits":2, + "rounding":0, + "code":"BGN", + "name_plural":"Bulgarian leva" + }, + "BHD":{ + "symbol":"BD", + "name":"Bahraini Dinar", + "symbol_native":"د.ب.‏", + "decimal_digits":3, + "rounding":0, + "code":"BHD", + "name_plural":"Bahraini dinars" + }, + "BDT":{ + "symbol":"Tk", + "name":"Bangladeshi Taka", + "symbol_native":"৳", + "decimal_digits":2, + "rounding":0, + "code":"BDT", + "name_plural":"Bangladeshi takas" + }, + "AMD":{ + "symbol":"AMD", + "name":"Armenian Dram", + "symbol_native":"դր.", + "decimal_digits":0, + "rounding":0, + "code":"AMD", + "name_plural":"Armenian drams" + }, + "BWP":{ + "symbol":"BWP", + "name":"Botswanan Pula", + "symbol_native":"P", + "decimal_digits":2, + "rounding":0, + "code":"BWP", + "name_plural":"Botswanan pulas" + }, + "ALL":{ + "symbol":"ALL", + "name":"Albanian Lek", + "symbol_native":"Lek", + "decimal_digits":0, + "rounding":0, + "code":"ALL", + "name_plural":"Albanian lekë" + }, + "BRL":{ + "symbol":"R$", + "name":"Brazilian Real", + "symbol_native":"R$", + "decimal_digits":2, + "rounding":0, + "code":"BRL", + "name_plural":"Brazilian reals" + }, + "AUD":{ + "symbol":"AU$", + "name":"Australian Dollar", + "symbol_native":"$", + "decimal_digits":2, + "rounding":0, + "code":"AUD", + "name_plural":"Australian dollars" + }, + "USD":{ + "symbol":"$", + "name":"US Dollar", + "symbol_native":"$", + "decimal_digits":2, + "rounding":0, + "code":"USD", + "name_plural":"US dollars" + }, + "BZD":{ + "symbol":"BZ$", + "name":"Belize Dollar", + "symbol_native":"$", + "decimal_digits":2, + "rounding":0, + "code":"BZD", + "name_plural":"Belize dollars" + }, + "IDR":{ + "symbol":"Rp", + "name":"Indonesian Rupiah", + "symbol_native":"Rp", + "decimal_digits":0, + "rounding":0, + "code":"IDR", + "name_plural":"Indonesian rupiahs" + }, + "CUP":{ + "symbol":"MN$", + "name":"Cuban peso", + "symbol_native":"$", + "decimal_digits":2, + "rounding":0, + "code":"CUP", + "name_plural":"Cuban pesos" + }, + "TND":{ + "symbol":"DT", + "name":"Tunisian Dinar", + "symbol_native":"د.ت.‏", + "decimal_digits":3, + "rounding":0, + "code":"TND", + "name_plural":"Tunisian dinars" + }, + "BND":{ + "symbol":"BN$", + "name":"Brunei Dollar", + "symbol_native":"$", + "decimal_digits":2, + "rounding":0, + "code":"BND", + "name_plural":"Brunei dollars" + }, + "DZD":{ + "symbol":"DA", + "name":"Algerian Dinar", + "symbol_native":"د.ج.‏", + "decimal_digits":2, + "rounding":0, + "code":"DZD", + "name_plural":"Algerian dinars" + }, + "EGP":{ + "symbol":"EGP", + "name":"Egyptian Pound", + "symbol_native":"ج.م.‏", + "decimal_digits":2, + "rounding":0, + "code":"EGP", + "name_plural":"Egyptian pounds" + }, + "LBP":{ + "symbol":"L.L.", + "name":"Lebanese Pound", + "symbol_native":"ل.ل.‏", + "decimal_digits":0, + "rounding":0, + "code":"LBP", + "name_plural":"Lebanese pounds" + }, + "LKR":{ + "symbol":"SLRs", + "name":"Sri Lankan Rupee", + "symbol_native":"SL Re", + "decimal_digits":2, + "rounding":0, + "code":"LKR", + "name_plural":"Sri Lankan rupees" + }, + "CZK":{ + "symbol":"Kč", + "name":"Czech Republic Koruna", + "symbol_native":"Kč", + "decimal_digits":2, + "rounding":0, + "code":"CZK", + "name_plural":"Czech Republic korunas" + }, + "IQD":{ + "symbol":"IQD", + "name":"Iraqi Dinar", + "symbol_native":"د.ع.‏", + "decimal_digits":0, + "rounding":0, + "code":"IQD", + "name_plural":"Iraqi dinars" + }, + "KHR":{ + "symbol":"KHR", + "name":"Cambodian Riel", + "symbol_native":"៛", + "decimal_digits":2, + "rounding":0, + "code":"KHR", + "name_plural":"Cambodian riels" + }, + "KZT":{ + "symbol":"KZT", + "name":"Kazakhstani Tenge", + "symbol_native":"тңг.", + "decimal_digits":2, + "rounding":0, + "code":"KZT", + "name_plural":"Kazakhstani tenges" + }, + "ETB":{ + "symbol":"Br", + "name":"Ethiopian Birr", + "symbol_native":"Br", + "decimal_digits":2, + "rounding":0, + "code":"ETB", + "name_plural":"Ethiopian birrs" + }, + "GNF":{ + "symbol":"FG", + "name":"Guinean Franc", + "symbol_native":"FG", + "decimal_digits":0, + "rounding":0, + "code":"GNF", + "name_plural":"Guinean francs" + }, + "RSD":{ + "symbol":"din.", + "name":"Serbian Dinar", + "symbol_native":"дин.", + "decimal_digits":0, + "rounding":0, + "code":"RSD", + "name_plural":"Serbian dinars" + }, + "HKD":{ + "symbol":"HK$", + "name":"Hong Kong Dollar", + "symbol_native":"$", + "decimal_digits":2, + "rounding":0, + "code":"HKD", + "name_plural":"Hong Kong dollars" + }, + "GHS":{ + "symbol":"GH₵", + "name":"Ghanaian Cedi", + "symbol_native":"GH₵", + "decimal_digits":2, + "rounding":0, + "code":"GHS", + "name_plural":"Ghanaian cedis" + }, + "AED":{ + "symbol":"AED", + "name":"United Arab Emirates Dirham", + "symbol_native":"د.إ.‏", + "decimal_digits":2, + "rounding":0, + "code":"AED", + "name_plural":"UAE dirhams" + }, + "KMF":{ + "symbol":"CF", + "name":"Comorian Franc", + "symbol_native":"FC", + "decimal_digits":0, + "rounding":0, + "code":"KMF", + "name_plural":"Comorian francs" + }, + "KRW":{ + "symbol":"₩", + "name":"South Korean Won", + "symbol_native":"₩", + "decimal_digits":0, + "rounding":0, + "code":"KRW", + "name_plural":"South Korean won" + }, + "JMD":{ + "symbol":"J$", + "name":"Jamaican Dollar", + "symbol_native":"$", + "decimal_digits":2, + "rounding":0, + "code":"JMD", + "name_plural":"Jamaican dollars" + }, + "MOP":{ + "symbol":"MOP$", + "name":"Macanese Pataca", + "symbol_native":"MOP$", + "decimal_digits":2, + "rounding":0, + "code":"MOP", + "name_plural":"Macanese patacas" + }, + "GTQ":{ + "symbol":"GTQ", + "name":"Guatemalan Quetzal", + "symbol_native":"Q", + "decimal_digits":2, + "rounding":0, + "code":"GTQ", + "name_plural":"Guatemalan quetzals" + }, + "ARS":{ + "symbol":"AR$", + "name":"Argentine Peso", + "symbol_native":"$", + "decimal_digits":2, + "rounding":0, + "code":"ARS", + "name_plural":"Argentine pesos" + }, + "AZN":{ + "symbol":"man.", + "name":"Azerbaijani Manat", + "symbol_native":"ман.", + "decimal_digits":2, + "rounding":0, + "code":"AZN", + "name_plural":"Azerbaijani manats" + }, + "INR":{ + "symbol":"₹", + "name":"Indian Rupee", + "symbol_native":"Rs.", + "decimal_digits":2, + "rounding":0, + "code":"INR", + "name_plural":"Indian rupees" + }, + "MMK":{ + "symbol":"MMK", + "name":"Myanma Kyat", + "symbol_native":"K", + "decimal_digits":0, + "rounding":0, + "code":"MMK", + "name_plural":"Myanma kyats" + }, + "BOB":{ + "symbol":"Bs", + "name":"Bolivian Boliviano", + "symbol_native":"Bs", + "decimal_digits":2, + "rounding":0, + "code":"BOB", + "name_plural":"Bolivian bolivianos" + }, + "LYD":{ + "symbol":"LD", + "name":"Libyan Dinar", + "symbol_native":"د.ل.‏", + "decimal_digits":3, + "rounding":0, + "code":"LYD", + "name_plural":"Libyan dinars" + }, + "DOP":{ + "symbol":"RD$", + "name":"Dominican Peso", + "symbol_native":"RD$", + "decimal_digits":2, + "rounding":0, + "code":"DOP", + "name_plural":"Dominican pesos" + }, + "YER":{ + "symbol":"YR", + "name":"Yemeni Rial", + "symbol_native":"ر.ي.‏", + "decimal_digits":0, + "rounding":0, + "code":"YER", + "name_plural":"Yemeni rials" + }, + "UYU":{ + "symbol":"$U", + "name":"Uruguayan Peso", + "symbol_native":"$", + "decimal_digits":2, + "rounding":0, + "code":"UYU", + "name_plural":"Uruguayan pesos" + }, + "KES":{ + "symbol":"Ksh", + "name":"Kenyan Shilling", + "symbol_native":"Ksh", + "decimal_digits":2, + "rounding":0, + "code":"KES", + "name_plural":"Kenyan shillings" + }, + "NZD":{ + "symbol":"NZ$", + "name":"New Zealand Dollar", + "symbol_native":"$", + "decimal_digits":2, + "rounding":0, + "code":"NZD", + "name_plural":"New Zealand dollars" + }, + "CRC":{ + "symbol":"₡", + "name":"Costa Rican Colón", + "symbol_native":"₡", + "decimal_digits":0, + "rounding":0, + "code":"CRC", + "name_plural":"Costa Rican colóns" + }, + "KWD":{ + "symbol":"KD", + "name":"Kuwaiti Dinar", + "symbol_native":"د.ك.‏", + "decimal_digits":3, + "rounding":0, + "code":"KWD", + "name_plural":"Kuwaiti dinars" + }, + "MUR":{ + "symbol":"MURs", + "name":"Mauritian Rupee", + "symbol_native":"MURs", + "decimal_digits":0, + "rounding":0, + "code":"MUR", + "name_plural":"Mauritian rupees" + }, + "NGN":{ + "symbol":"₦", + "name":"Nigerian Naira", + "symbol_native":"₦", + "decimal_digits":2, + "rounding":0, + "code":"NGN", + "name_plural":"Nigerian nairas" + }, + "CNY":{ + "symbol":"CN¥", + "name":"Chinese Yuan", + "symbol_native":"CN¥", + "decimal_digits":2, + "rounding":0, + "code":"CNY", + "name_plural":"Chinese yuan" + }, + "PYG":{ + "symbol":"₲", + "name":"Paraguayan Guarani", + "symbol_native":"₲", + "decimal_digits":0, + "rounding":0, + "code":"PYG", + "name_plural":"Paraguayan guaranis" + }, + "MXN":{ + "symbol":"MX$", + "name":"Mexican Peso", + "symbol_native":"$", + "decimal_digits":2, + "rounding":0, + "code":"MXN", + "name_plural":"Mexican pesos" + }, + "ZAR":{ + "symbol":"R", + "name":"South African Rand", + "symbol_native":"R", + "decimal_digits":2, + "rounding":0, + "code":"ZAR", + "name_plural":"South African rand" + }, + "RWF":{ + "symbol":"RWF", + "name":"Rwandan Franc", + "symbol_native":"FR", + "decimal_digits":0, + "rounding":0, + "code":"RWF", + "name_plural":"Rwandan francs" + }, + "DJF":{ + "symbol":"Fdj", + "name":"Djiboutian Franc", + "symbol_native":"Fdj", + "decimal_digits":0, + "rounding":0, + "code":"DJF", + "name_plural":"Djiboutian francs" + }, + "CAD":{ + "symbol":"CA$", + "name":"Canadian Dollar", + "symbol_native":"$", + "decimal_digits":2, + "rounding":0, + "code":"CAD", + "name_plural":"Canadian dollars" + }, + "BYN":{ + "symbol":"Br", + "name":"Belarusian Ruble", + "symbol_native":"руб.", + "decimal_digits":2, + "rounding":0, + "code":"BYN", + "name_plural":"Belarusian rubles" + }, + "UGX":{ + "symbol":"USh", + "name":"Ugandan Shilling", + "symbol_native":"USh", + "decimal_digits":0, + "rounding":0, + "code":"UGX", + "name_plural":"Ugandan shillings" + }, + "NIO":{ + "symbol":"C$", + "name":"Nicaraguan Córdoba", + "symbol_native":"C$", + "decimal_digits":2, + "rounding":0, + "code":"NIO", + "name_plural":"Nicaraguan córdobas" + }, + "XCD":{ + "symbol":"EC$", + "name":"Eastern Caribbean dollar", + "symbol_native":"EC$", + "decimal_digits":2, + "rounding":0, + "code":"XCD", + "name_plural":"Eastern Caribbean dollars" + }, + "NAD":{ + "symbol":"N$", + "name":"Namibian Dollar", + "symbol_native":"N$", + "decimal_digits":2, + "rounding":0, + "code":"NAD", + "name_plural":"Namibian dollars" + }, + "MYR":{ + "symbol":"RM", + "name":"Malaysian Ringgit", + "symbol_native":"RM", + "decimal_digits":2, + "rounding":0, + "code":"MYR", + "name_plural":"Malaysian ringgits" + }, + "HUF":{ + "symbol":"Ft", + "name":"Hungarian Forint", + "symbol_native":"Ft", + "decimal_digits":0, + "rounding":0, + "code":"HUF", + "name_plural":"Hungarian forints" + }, + "PLN":{ + "symbol":"zł", + "name":"Polish Zloty", + "symbol_native":"zł", + "decimal_digits":2, + "rounding":0, + "code":"PLN", + "name_plural":"Polish zlotys" + }, + "SEK":{ + "symbol":"Skr", + "name":"Swedish Krona", + "symbol_native":"kr", + "decimal_digits":2, + "rounding":0, + "code":"SEK", + "name_plural":"Swedish kronor" + }, + "MDL":{ + "symbol":"MDL", + "name":"Moldovan Leu", + "symbol_native":"MDL", + "decimal_digits":2, + "rounding":0, + "code":"MDL", + "name_plural":"Moldovan lei" + }, + "OMR":{ + "symbol":"OMR", + "name":"Omani Rial", + "symbol_native":"ر.ع.‏", + "decimal_digits":3, + "rounding":0, + "code":"OMR", + "name_plural":"Omani rials" + }, + "TRY":{ + "symbol":"TL", + "name":"Turkish Lira", + "symbol_native":"TL", + "decimal_digits":2, + "rounding":0, + "code":"TRY", + "name_plural":"Turkish Lira" + }, + "PEN":{ + "symbol":"S/.", + "name":"Peruvian Nuevo Sol", + "symbol_native":"S/.", + "decimal_digits":2, + "rounding":0, + "code":"PEN", + "name_plural":"Peruvian nuevos soles" + }, + "MZN":{ + "symbol":"MTn", + "name":"Mozambican Metical", + "symbol_native":"MTn", + "decimal_digits":2, + "rounding":0, + "code":"MZN", + "name_plural":"Mozambican meticals" + }, + "XAF":{ + "symbol":"FCFA", + "name":"CFA Franc BEAC", + "symbol_native":"FCFA", + "decimal_digits":0, + "rounding":0, + "code":"XAF", + "name_plural":"CFA francs BEAC" + }, + "MKD":{ + "symbol":"MKD", + "name":"Macedonian Denar", + "symbol_native":"MKD", + "decimal_digits":2, + "rounding":0, + "code":"MKD", + "name_plural":"Macedonian denari" + }, + "PAB":{ + "symbol":"B/.", + "name":"Panamanian Balboa", + "symbol_native":"B/.", + "decimal_digits":2, + "rounding":0, + "code":"PAB", + "name_plural":"Panamanian balboas" + }, + "GBP":{ + "symbol":"£", + "name":"British Pound Sterling", + "symbol_native":"£", + "decimal_digits":2, + "rounding":0, + "code":"GBP", + "name_plural":"British pounds sterling" + }, + "CLP":{ + "symbol":"CL$", + "name":"Chilean Peso", + "symbol_native":"$", + "decimal_digits":0, + "rounding":0, + "code":"CLP", + "name_plural":"Chilean pesos" + }, + "PHP":{ + "symbol":"₱", + "name":"Philippine Peso", + "symbol_native":"₱", + "decimal_digits":2, + "rounding":0, + "code":"PHP", + "name_plural":"Philippine pesos" + }, + "TOP":{ + "symbol":"T$", + "name":"Tongan Paʻanga", + "symbol_native":"T$", + "decimal_digits":2, + "rounding":0, + "code":"TOP", + "name_plural":"Tongan paʻanga" + }, + "GEL":{ + "symbol":"GEL", + "name":"Georgian Lari", + "symbol_native":"GEL", + "decimal_digits":2, + "rounding":0, + "code":"GEL", + "name_plural":"Georgian laris" + }, + "RUB":{ + "symbol":"RUB", + "name":"Russian Ruble", + "symbol_native":"₽.", + "decimal_digits":2, + "rounding":0, + "code":"RUB", + "name_plural":"Russian rubles" + }, + "SDG":{ + "symbol":"SDG", + "name":"Sudanese Pound", + "symbol_native":"SDG", + "decimal_digits":2, + "rounding":0, + "code":"SDG", + "name_plural":"Sudanese pounds" + }, + "RON":{ + "symbol":"RON", + "name":"Romanian Leu", + "symbol_native":"RON", + "decimal_digits":2, + "rounding":0, + "code":"RON", + "name_plural":"Romanian lei" + }, + "SGD":{ + "symbol":"S$", + "name":"Singapore Dollar", + "symbol_native":"$", + "decimal_digits":2, + "rounding":0, + "code":"SGD", + "name_plural":"Singapore dollars" + }, + "SOS":{ + "symbol":"Ssh", + "name":"Somali Shilling", + "symbol_native":"Ssh", + "decimal_digits":0, + "rounding":0, + "code":"SOS", + "name_plural":"Somali shillings" + }, + "THB":{ + "symbol":"฿", + "name":"Thai Baht", + "symbol_native":"฿", + "decimal_digits":2, + "rounding":0, + "code":"THB", + "name_plural":"Thai baht" + }, + "TWD":{ + "symbol":"NT$", + "name":"New Taiwan Dollar", + "symbol_native":"NT$", + "decimal_digits":2, + "rounding":0, + "code":"TWD", + "name_plural":"New Taiwan dollars" + }, + "QAR":{ + "symbol":"QR", + "name":"Qatari Rial", + "symbol_native":"ر.ق.‏", + "decimal_digits":2, + "rounding":0, + "code":"QAR", + "name_plural":"Qatari rials" + }, + "UZS":{ + "symbol":"UZS", + "name":"Uzbekistan Som", + "symbol_native":"UZS", + "decimal_digits":0, + "rounding":0, + "code":"UZS", + "name_plural":"Uzbekistan som" + }, + "SAR":{ + "symbol":"SR", + "name":"Saudi Riyal", + "symbol_native":"ر.س.‏", + "decimal_digits":2, + "rounding":0, + "code":"SAR", + "name_plural":"Saudi riyals" + }, + "NOK":{ + "symbol":"Nkr", + "name":"Norwegian Krone", + "symbol_native":"kr", + "decimal_digits":2, + "rounding":0, + "code":"NOK", + "name_plural":"Norwegian kroner" + }, + "HNL":{ + "symbol":"HNL", + "name":"Honduran Lempira", + "symbol_native":"L", + "decimal_digits":2, + "rounding":0, + "code":"HNL", + "name_plural":"Honduran lempiras" + }, + "MGA":{ + "symbol":"MGA", + "name":"Malagasy Ariary", + "symbol_native":"MGA", + "decimal_digits":0, + "rounding":0, + "code":"MGA", + "name_plural":"Malagasy Ariaries" + }, + "NPR":{ + "symbol":"NPRs", + "name":"Nepalese Rupee", + "symbol_native":"नेरू", + "decimal_digits":2, + "rounding":0, + "code":"NPR", + "name_plural":"Nepalese rupees" + }, + "UAH":{ + "symbol":"₴", + "name":"Ukrainian Hryvnia", + "symbol_native":"₴", + "decimal_digits":2, + "rounding":0, + "code":"UAH", + "name_plural":"Ukrainian hryvnias" + }, + "PKR":{ + "symbol":"PKRs", + "name":"Pakistani Rupee", + "symbol_native":"₨", + "decimal_digits":0, + "rounding":0, + "code":"PKR", + "name_plural":"Pakistani rupees" + }, + "VND":{ + "symbol":"₫", + "name":"Vietnamese Dong", + "symbol_native":"₫", + "decimal_digits":0, + "rounding":0, + "code":"VND", + "name_plural":"Vietnamese dong" + }, + "ISK":{ + "symbol":"Ikr", + "name":"Icelandic Króna", + "symbol_native":"kr", + "decimal_digits":0, + "rounding":0, + "code":"ISK", + "name_plural":"Icelandic krónur" + }, + "BAM":{ + "symbol":"KM", + "name":"Bosnia-Herzegovina Convertible Mark", + "symbol_native":"KM", + "decimal_digits":2, + "rounding":0, + "code":"BAM", + "name_plural":"Bosnia-Herzegovina convertible marks" + }, + "DKK":{ + "symbol":"Dkr", + "name":"Danish Krone", + "symbol_native":"kr", + "decimal_digits":2, + "rounding":0, + "code":"DKK", + "name_plural":"Danish kroner" + }, + "CHF":{ + "symbol":"CHF", + "name":"Swiss Franc", + "symbol_native":"CHF", + "decimal_digits":2, + "rounding":0.05, + "code":"CHF", + "name_plural":"Swiss francs" + }, + "CDF":{ + "symbol":"CDF", + "name":"Congolese Franc", + "symbol_native":"FrCD", + "decimal_digits":2, + "rounding":0, + "code":"CDF", + "name_plural":"Congolese francs" + }, + "MAD":{ + "symbol":"MAD", + "name":"Moroccan Dirham", + "symbol_native":"د.م.‏", + "decimal_digits":2, + "rounding":0, + "code":"MAD", + "name_plural":"Moroccan dirhams" + }, + "BIF":{ + "symbol":"FBu", + "name":"Burundian Franc", + "symbol_native":"FBu", + "decimal_digits":0, + "rounding":0, + "code":"BIF", + "name_plural":"Burundian francs" + }, + "IRR":{ + "symbol":"IRR", + "name":"Iranian Rial", + "symbol_native":"﷼", + "decimal_digits":0, + "rounding":0, + "code":"IRR", + "name_plural":"Iranian rials" + }, + "CVE":{ + "symbol":"CV$", + "name":"Cape Verdean Escudo", + "symbol_native":"CV$", + "decimal_digits":2, + "rounding":0, + "code":"CVE", + "name_plural":"Cape Verdean escudos" + } + }