I’ve recently been working on a PowerShell module for exploring Azure costs and while doing so added some functionality to allow the costs to be converted between different currencies. It occurred to me that this functionality would be useful as a module of its own, and when I searched around I didn’t find too many recent examples for the same. As such I’ve now developed and published a module in the PowerShell Gallery and on GitHub called CurrencyConverter.

https://github.com/markwragg/PowerShell-CurrencyConverter/

The module is essentially a PowerShell wrapper for the currency conversion API that is provided by ExchangeRate-API. They provide an open API, which requires no registration or API key to use. This was helpful for my other module as I didn’t want the user to have to take a dependency on registering for a service for it to work. By default the Currency Converter module uses the open API, but if you have registered and wish to use an API key, you can provide one via the -APIKey parameters of Convert-Currency and Get-ExchangeRate. Note that with the open API, the rates refresh once every 24 hours. This is also true for the free tier of the registered API, but you are less likely to be rate limited. If you take one of their paid plans then the currency conversion rates refresh more frequently.

The Currency Converter module is published in the PowerShell Gallery, so can be installed by running:

Install-Module CurrencyConverter

Usage

This module provides the following cmdlets:

Cmdlet Description
Convert-Currency Converts a decimal value between two specified currencies.
Format-Currency Formats a value as a string with the currency symbol for a specified country.
Get-Currency Returns the list of supported currency codes along with their currency name and country code.
Get-ExchangeRate Returns all exchange rates for a specified currency, or a specified exchange rate between two currencies.

Convert-Currency

To perform a simple currency conversion, execute:

Convert-Currency -Value 100 -From USD -To GBP

To use the registered API, provide your key via the -APIKey parameter:

Convert-Currency -Value 100 -From USD -To GBP -ApiKey yourapikeystringhere

See here for a list of supported currencies: https://www.exchangerate-api.com/docs/supported-currencies. Alternatively you can use the Get-Currency cmdlet.

After querying the API, the response is saved within the module directory, as a JSON file. If you query the API for the same currency again, the file will be read. It contains a date field for when the values next refresh. If the current date is earlier than this value, then the file is used. If it is after this date, the API is queried again and the file updated. As a result this module will only query the API once a day, per currency.

You can alternatively provide the value to be converted via the pipeline:

100 | Convert-Currency -From EUR -To CAD
79.201100

And this means that you can pipe multiple values in to perform a series of conversions:

100,200,250 | Convert-Currency -From USD -To JPY
14805.315400
29610.630800
37013.288500

Format-Currency

The value returned by Convert-Currency is always a decimal, to ensure we keep the result as precise as possible, and in case you want to do further calculations. If you want to present the result (such as in a report) as a currency value, then you can use the Format-Currency cmdlet. This returns a string value, rounded to two decimal places (by default) and with the corresponding currency symbol added. Obviously you can’t then treat this result as a decimal value, so you probably want to ensure this cmdlet is used last in your pipeline.

100 | Format-Currency -Currency USD
$100.00

You can specify a different number of decimal places to round to, via the -Decimals parameter:

Format-Currency -Value 123.4567890 -Currency GBP -Decimals 4
£123.4568

You can also perform a currency conversion at the same time as performing the format:

Format-Currency -Value 100 -Currency GBP -ConvertTo USD
$125.85

For some currencies it may be convention to put the currency symbol after the value. This can be achieved by specifying the -SymbolAtEnd switch parameter:

Format-Currency -Value 100 -Currency GBP -SymbolAtEnd
125.85£

Format-Currency also supports pipeline input, so you can simply pipe the result of Convert-Currency to Format-Currency:

Convert-Currency -Value 100 -From USD -To EUR | Format-Currency -Currency EUR
€93.04

Get-Currency

The currency code inputs for the previous two cmdlets have a validateset attribute, so if you try to use an unsupported code an error is returned with the list of codes supported. If you’re not sure what the code is for a particular currency or country, you can explore them with the Get-Currency cmdlet. Executing this on its own returns all of the supported currency codes along with their currency name and country:

Get-Currency
Code Name                          Country
---- ----                          -------
AED  UAE Dirham                    United Arab Emirates
AFN  Afghan Afghani                Afghanistan
ALL  Albanian Lek                  Albania
AMD  Armenian Dram                 Armenia
ANG  Netherlands Antillian Guilder Netherlands Antilles
AOA  Angolan Kwanza                Angola
ARS  Argentine Peso                Argentina
AUD  Australian Dollar             Australia
AWG  Aruban Florin                 Aruba
AZN  Azerbaijani Manat             Azerbaijan
BAM  Bosnia and Herzegovina Mark   Bosnia and Herzegovina
...

Note that for all European Countries that use the Euro, “European Union” is listed as the country. I appreciate this isn’t entirely accurate and possibly politically controversial :).

With Get-Currency you can also specify a specific code (this requires an exact match):

Get-Currency -Currency GBP

Or you can filter by currency or country name (this will return results for partial matches):

Get-Currency -Name 'Pound'
Code Name                   Country
---- ----                   -------
EGP  Egyptian Pound         Egypt
FKP  Falkland Islands Pound Falkland Islands
GBP  Pound Sterling         United Kingdom
GGP  Guernsey Pound         Guernsey
GIP  Gibraltar Pound        Gibraltar
IMP  Manx Pound             Isle of Man
JEP  Jersey Pound           Jersey
LBP  Lebanese Pound         Lebanon
SDG  Sudanese Pound         Sudan
SHP  Saint Helena Pound     Saint Helena
SSP  South Sudanese Pound   South Sudan
SYP  Syrian Pound           Syria
Get-Currency -Country 'United'
Code Name                 Country
---- ----                 -------
AED  UAE Dirham           United Arab Emirates
GBP  Pound Sterling       United Kingdom
USD  United States Dollar United States

Get-ExchangeRate

Finally there is the Get-ExchangeRate cmdlet. You can use this to return the full result from the API as a PowerShell object, which includes the fields that show when the next update will be available and all of the supported rates for a specified currency:

Get-ExchangeRate -Currency USD

To use the registered API, provide your key via the -APIKey parameter:

Get-ExchangeRate -Currency GBP -ApiKey yourapikeystringhere

When an API key is provided, the v6 API is invoked. This returns the rates as a property called ‘conversion_rates’. The Open API returns the property as ‘rates’.

result                : success
provider              : https://www.exchangerate-api.com
documentation         : https://www.exchangerate-api.com/docs/free
terms_of_use          : https://www.exchangerate-api.com/terms
time_last_update_unix : 1707350551
time_last_update_utc  : Thu, 08 Feb 2024 00:02:31 +0000
time_next_update_unix : 1707437661
time_next_update_utc  : Fri, 09 Feb 2024 00:14:21 +0000
time_eol_unix         : 0
base_code             : USD
rates                 : @{USD=1; AED=3.6725; AFN=73.755496; ALL=96.818553; AMD=405.868756; ANG=1.79; AOA=839.476403; ARS=830.15;
                        AUD=1.533245; AWG=1.79; AZN=1.699659; BAM=1.81591; BBD=2; BDT=109.768633; BGN=1.81581; BHD=0.376;
                        BIF=2850.388516; BMD=1; BND=1.343391; BOB=6.934197; BRL=4.962119; BSD=1; BTN=83.001945; BWP=13.679849;
                        BYN=3.245101; BZD=2; CAD=1.346345; CDF=2728.475301; CHF=0.873457; CLP=947.575519; CNY=7.19952;
                        COP=3954.758146; CRC=517.23293; CUP=24; CVE=102.376655; CZK=23.176359; DJF=177.721; DKK=6.92457;
                        DOP=58.566572; DZD=134.658699; EGP=30.904297; ERN=15; ETB=56.700184; EUR=0.928449; FJD=2.247047;
                        FKP=0.792018; FOK=6.92461; GBP=0.792011; GEL=2.659816; GGP=0.792018; GHS=12.422748; GIP=0.792018;
                        GMD=66.562902; GNF=8588.188018; GTQ=7.814905; GYD=209.536717; HKD=7.820255; HNL=24.66876; HRK=6.995483;
                        HTG=131.989675; HUF=360.172059; IDR=15650.579046; ILS=3.652044; IMP=0.792018; INR=83.001968;
                        IQD=1310.842088; IRR=42080.433475; ISK=137.663905; JEP=0.792018; JMD=156.245808; JOD=0.709;
                        JPY=148.053154; KES=160.352692; KGS=89.414602; KHR=4091.328437; KID=1.533294; KMF=456.772434;
                        KRW=1326.84486; KWD=0.307938; KYD=0.833333; KZT=452.274884; LAK=20736.087575; LBP=15000; LKR=312.628935;
                        LRD=192.145847; LSL=18.897808; LYD=4.844127; MAD=10.061229; MDL=17.827961; MGA=4536.616958;
                        MKD=57.312368; MMK=2099.744651; MNT=3412.288092; MOP=8.054862; MRU=39.584855; MUR=45.384067;
                        MVR=15.453447; MWK=1689.264206; MXN=17.05608; MYR=4.761416; MZN=63.917225; NAD=18.897808;
                        NGN=1407.528785; NIO=36.672231; NOK=10.577722; NPR=132.803112; NZD=1.636807; OMR=0.384497; PAB=1;
                        PEN=3.861833; PGK=3.749532; PHP=56.01365; PKR=279.042023; PLN=4.033029; PYG=7296.21721; QAR=3.64;
                        RON=4.620779; RSD=108.801814; RUB=91.346239; RWF=1284.744312; SAR=3.75; SBD=8.488406; SCR=13.291546;
                        SDG=544.79719; SEK=10.475851; SGD=1.343391; SHP=0.792018; SLE=22.587694; SLL=22587.694431;
                        SOS=571.785619; SRD=36.611265; SSP=1102.449099; STN=22.747273; SYP=12950.775091; SZL=18.897808;
                        THB=35.595367; TJS=10.947348; TMT=3.500938; TND=3.129049; TOP=2.371485; TRY=30.62091; TTD=6.777386;
                        TVD=1.533294; TWD=31.341578; TZS=2541.212285; UAH=37.600041; UGX=3817.518963; UYU=39.148736;
                        UZS=12479.514661; VES=36.2375; VND=24413.241561; VUV=120.508933; WST=2.745778; XAF=609.029912; XCD=2.7;
                        XDR=0.754059; XOF=609.029912; XPF=110.795003; YER=250.331823; ZAR=18.897825; ZMW=27.029301;
                        ZWL=10811.587531}

If you want to return just the exchange rates, you can execute Get-ExchangeRate and specify the -Rates parameter:

Get-ExchangeRate -Currency GBP -Rates
GBP : 1
AED : 4.636888
AFN : 92.99538
ALL : 122.070196
AMD : 510.608906
ANG : 2.260049
AOA : 1067.044213
ARS : 1048.144979
AUD : 1.935836
AWG : 2.260049
AZN : 2.145246
BAM : 2.292681
BBD : 2.525194
BDT : 138.549806
...

If you just want to return a specific exchange rate, you can execute Get-ExchangeRate and specify -From and -To. This will get you the rate of exchange, instead of performing a conversion:

Get-ExchangeRate -From GBP -To USD
1.262609

Get-ExchangeRate also supports pipeline input, so if you want to get the exchange rate details for a set of currencies you can execute:

'USD','GBP','EUR' | Get-ExchangeRate

Finally, if for some reason you wanted to query the API for every currency (resulting in the module caching every currencies exchange rate to disk), you could do the following (although beware this might trigger rate limiting for the API, as it will make 161 queries in quick succession):

(Get-Currency).Code | Get-ExchangeRate

I hope you found this useful. If you experience any issues or can think of improvements that could be made, please see here for how to request or make a contribution:

  • https://github.com/markwragg/PowerShell-CurrencyConverter/blob/main/CONTRIBUTING.md

Updated:

Comments