Translated from the Spanish original. Where they differ, the Spanish one holds.
- For: every Horalis tool · Reviewed: 9 October 2026 (phase A3 of the Horalis plan)
- Code (in
packages/seed-kit/):src/official/money-tables.ts: makes the two tables in the build;scripts/money-tables.ts(npm run money-tables): writes them;src/data/currencies.jsonandsrc/data/exchange-rates.json: the tables the pages read;src/money.ts: each country's currency, a year's rate and the conversion;src/format.ts: how an amount is written in each currency and language (formatsFor,roundMoney);src/detect.ts: the country the browser's language says (regionOf,countryFromLanguage).
- In each tool: Horalis Cost of Living (
projects/cost-lens/src/countries.ts,calc.ts,view.ts), Horalis Inflation (projects/inflation-lens/src/series.ts) and Horalis Growth (projects/wealth-lens/src/lib/money.ts,app-store.ts,i18n/make.ts). - Data: those of module A1 (official data).
- Tests:
packages/seed-kit/test/money.test.ts,format.test.ts,detect.test.ts;projects/cost-lens/test/calc.test.ts;projects/inflation-lens/test/*.test.ts;projects/wealth-lens/src/lib/money.test.ts,validation.test.ts.
The question it answers
"Does this work for me, in my country and in my currency?" Each tool works in its user's currency, writes numbers their way and, when it turns a figure from one currency into another, says with which official rate and of which year.
In plain words
- Each country's currency is the one Unicode CLDR says (ISO 4217 code: EUR, PEN, MXN…). A table of 215 countries.
- The exchange rate is the yearly average the World Bank publishes (PA.NUS.FCRF), in units of each currency per dollar, from 2015 to the latest year. Never a rate of the day, never a rate typed by hand.
- Converting is dividing by the rate of the original currency and multiplying by that of the target one, of the same year. The page says the year.
- The starting country comes from the browser's language (es-MX → Mexico; "en" → the United States), on the device itself. Nothing is kept or sent, and the location is not used. The person changes it whenever they like.
- Numbers are written as the page's language writes them and, if the browser names a region in that same language, as in that region (es-MX: 1,234.5; es-ES: 1234,5).
Exact:
r(c, y)= units of currencycper dollar in yeary.xfromAtoBin yeary=x × r(B, y) / r(A, y).- Without
y: the last year with a rate for both. With aywithout a rate for one of them: the closest year both have, and the conversion returns that year (convert).
How the table of rates is made
The World Bank gives the rates by country, and several countries share a currency. For each currency:
- A fixed country is taken when there is a clear one (
RATE_COUNTRY): the euro from Germany, the dollar from the US, the West African CFA franc from Senegal, the Central African one from Cameroon, the East Caribbean dollar from Saint Lucia, and the own currency of AU, CH, NZ, ZA, IN, IL, DK, NO and GB. So the euro does not take the years of Croatia (kunas) or Bulgaria (leva). - The years it lacks are filled in with other countries of the same currency only if they match it (a difference of less than 1 % in the common years).
- New currencies. A country only gives years from the first whole year of its current currency, by CLDR's start date (
currencySince: the bolívar soberano, 20 August 2018 → from 2019; the euro in Croatia, 1 January 2023 → from 2023). The World Bank sometimes restates the old years in the new currency and sometimes not (the VES of 2015–2017 was the bolívar fuerte, 100,000 times larger): when in doubt those years are lost rather than mixing two currencies. Also, if from one year to the next the rate jumps by more than ×20, the currency changed even if CLDR does not say so (the Zimbabwe dollar…), and the earlier years are cut. - The dollar is worth 1 every year.
Result (9 Oct. 2026): 145 currencies with a rate, 2015–2025 (without the VES or the Caribbean guilder, XCG, born in 2025).
Each tool
- Horalis Cost of Living. What is typed is in the currency of the country where you live; the result, in that of the country you compare with. The countries' costs are in dollars of their price year (2024); they are turned into each currency with the rate of that same year. A country whose currency has no rate that year comes out in dollars, and the page says so beside the result ("Iran: in US dollars, with no official 2024 rate"): a rate from another year would mix prices of two years. Today they are 8 countries (CD, GN, IR, LK, MM, MR, MW, SL). Beside the result: "With the official rates of 2024: €1 = PEN 4.06". The starting amount is what an average person of the starting country lives on per month, in its currency. When "Where you live" changes, what was typed moves to the new currency with the same rate (it is still the same money); if it had not been touched, it moves to what an average person lives on there.
- Number format. In the three tools, as the reader's region writes them if their browser speaks the page's language (es-MX on
/es: 1,234.5; en-IN: 1,50,000). Growth also reads India's lakhs and the Swiss apostrophe (150’000) when typing. - Horalis Inflation. Each place in its current currency (the euro area and the EU: euro). Inflation changes what money buys, not its currency: there is no conversion. A country outside the EU starts in the first whole year of its current currency, like the exchange rates (rule 3): see inflation.
- Horalis Growth. The plan has a currency ("Your amounts are in", in More options), any with a rate in the price year of the countries.
- The amounts you type are in it, and its symbol goes inside the field; changing it does not convert them. The grey examples are the same amount of money in it (€1,000 → MX$20,000).
- Growth is each investment's after the rise in prices, in its own currency: it does not count the changes between currencies (How it works says so).
- Each country's cost comes out in that currency: 2024 dollars × the 2024 rate, rounded like every cost (
roundMoney). - The app's steps ("+€50 a month", the observations' "+€100 a month") and the observations' thresholds ("from €1,000") are the same amount of money in the plan's currency: €50 at the 2024 rate, rounded to 1, 2 or 5 times a power of ten ($50, S/ 200, ¥10,000). With euros, exactly those of before.
- When "Rising prices in" changes, the currency follows the country if it was the previous country's; if the person chose another, it stays.
- A first visit starts in the country and the currency the browser's language says, if the app has their figures; a plan already touched does not change.
- The data file moves to version 12 and keeps the currency; earlier files were in euros and are read in euros. A file with a currency that has a rate in some year keeps it (if the yearly update takes away the price year's rate, the costs use the closest year); with an unknown currency it is read in euros, and it says so.
- An amount's cap rises from 10⁹ to 10¹⁵: a thousand million euros in the plan's currency with the most units per euro (the Lebanese pound, some 9.7 × 10¹³ in 2024).
Rounding
A cost is shown to the unit below 95, to the ten below 10,000 and to three figures above (roundMoney): ¥246,000, not ¥245,678. A finer step would claim a precision the data do not have. Below 95 was before "to €1 below €100"; the change only affects figures between 95 and 99, which now go to the ten.
Assumptions
- The yearly average serves to turn figures of the same year from one currency into another.
- A country's current currency holds for all its amounts today.
- The browser's language says where the person lives fairly often; when it does not, they change it.
- €50 at the official rate is "the same amount of money" in another currency. In purchasing power it is not (PPP measures that); for a button's step it is enough.
Sources, dated
- World Bank, PA.NUS.FCRF, official exchange rate (yearly average), CC BY 4.0. Download of 9 October 2026, provisional (the World Bank's public mirror on GitHub, the update of 1 July 2026); A1's yearly download replaces it.
- Unicode CLDR 48.2.0,
supplemental/currencyData.json, Unicode License v3: each country's currency.
Validation (tests)
- The tables are what the official data give (if not,
npm run money-tables). - Each country has its ISO 4217 currency; the euro comes from Germany and is less than 1 dollar in every year; no currency jumps by more than ×20 from one year to the next.
- A conversion uses the same year for both currencies, there and back gives the same amount, and without a rate it returns the closest year or nothing.
- Formats: the dollar in the US, the peso in Mexico, the sol in Peru, the euro in Spain and the Netherlands, the pound in words, the yen in powers of ten.
- Cost of Living: euros to soles and back; the sentence with the rate and the year; the starting country by language.
- Growth: the result does not change with the currency; Peru's cost in soles; the step of S/ 200; the currency that follows the country; the first visit by language and a touched plan that does not change; files without a currency in euros.
Limits
- A yearly average rate is neither the bank's rate nor today's.
- Currencies with several rates (official and parallel): the official one is used, which can be far from the one paid in the street (Argentina, Iran, Nigeria in some years).
- Growth does not count what someone gains or loses who invests in one currency and lives in another.
- The browser's language is not the location: someone in Germany with the browser in English starts in the US and dollars.
What is debatable
- Countries without a rate for the price year, in dollars. The closest year could be used with the country's inflation in between. Cost: one more assumption; today it affects 8 countries.
- The step by exchange rate and not by PPP. With PPP, "+€50 a month" in India would be more rupees than the rate gives. Cost: little; but it changes the figure the person sees on the button.
- The number format of the browser's region. Only if the language matches the page's: "en-NL" mixes two ways of writing (1.234,5 in numbers and €1,234.50 in money), so it is not used.
History
- 2026-10-09 (phase A3, after the independent review): each currency's start date (CLDR) so as not to mix the bolívar fuerte with the soberano; Cost of Living's amount follows the country; the reader's format in the three tools; files with currencies that lose their year's rate.
- 2026-10-09 (phase A3): new sheet. A currency per country, official rates per year, conversions with a visible year, formats by region, a starting country by language. Cost of Living and Growth stop being in euros only.