[]
{ if (configuration.isSticky) { fragmentElement.style.height = ‘100%’; // Set the height of the fragment element if sticky configuration is enabled } const parentRow = fragmentElement.closest(‘.row, .ecl-row’); // Find the closest parent row element const selector = buildSelector(configuration); // Build the CSS selector based on configuration const headings = Array.from(parentRow.querySelectorAll(selector)); // Get all headings within the parent row const tableOfContents = buildTableOfContents(headings); // Build the table of contents from the headings const navList = fragmentElement.querySelector(‘.estat-inpage-nav__list’); // Get the navigation list element generateList(navList, tableOfContents); // Generate the navigation list from the table of contents const topMargin = document.querySelector(‘.has-control-menu’) ? 120 : 66; // Determine the top margin based on the presence of a control menu const observeHeadings = new IntersectionObserver( (entries) => observeScrolling(entries, topMargin, headings), { rootMargin: `-${topMargin}px 0px 0px 0px` } // Set the root margin for the intersection observer ); headings.forEach(heading => observeHeadings.observe(heading)); // Observe each heading for intersection changes setupEventListeners(fragmentElement, headings); // Set up event listeners for the navigation elements document.getElementById(‘skip-inpage-navigation’).href = `#${headings[0]?.id}`; // Set the href for the skip navigation link const spinner = fragmentElement.querySelector(‘.ecl-spinner.ecl-spinner–visible’); // Get the spinner element spinner.classList.remove(‘ecl-spinner–visible’); // Hide the spinner fragmentElement.querySelector(‘.estat-inpage-nav’).classList.remove(‘ecl-u-d-none’); // Show the navigation element }); /** * Builds a CSS selector string based on the configuration object. * @param {Object} configuration – Configuration object containing heading levels and other settings. * @returns {string} – The CSS selector string. */ function buildSelector(configuration) { let selector = ”; const deepestLevel = configuration.headingLevel.slice(-1); // Get the deepest heading level from the configuration const topLevel = 2; // Define the top level heading for (let i = topLevel; i topLevel) { selector += ‘, ‘; // Add a comma separator for multiple selectors } selector += `h${i}`; // Add the heading level to the selector if (!configuration.includeNonECLHeadings) { selector += `.ecl-u-type-heading-${i}`; // Add the ECL heading class if non-ECL headings are not included } if (configuration.selectorToExclude) { selector += `:not(${configuration.selectorToExclude})`; // Exclude specific selectors if defined in the configuration } } return selector; } /** * Builds a table of contents array from the provided headings. * @param {Array} headings – Array of heading elements. * @returns {Array} – The table of contents array. */ function buildTableOfContents(headings) { let tableOfContents = []; headings.forEach((heading, i) => { if (!heading.id) { heading.id = ‘estat-inpage-nav-heading-‘ + i; // Assign a unique ID to the heading if it doesn’t have one } const objEl = { ‘id’: heading.id, ‘content’: heading.innerText, level: heading.nodeName.slice(-1) – 1, // Determine the heading level children: [] }; addHeadingToTableOfContents(objEl, tableOfContents); // Add the heading to the table of contents }); return tableOfContents; } /** * Adds a heading object to the table of contents array. * @param {Object} objEl – Heading object to add. * @param {Array} tableOfContents – The table of contents array. */ function addHeadingToTableOfContents(objEl, tableOfContents) { if (objEl.level === 1) { tableOfContents.push(objEl); // Add level 1 headings directly to the table of contents } else if (objEl.level === 2) { tableOfContents[tableOfContents.length – 1].children.push(objEl); // Add level 2 headings as children of the last level 1 heading } else if (objEl.level === 3) { const childrenArr = tableOfContents[tableOfContents.length – 1].children; childrenArr[childrenArr.length – 1].children.push(objEl); // Add level 3 headings as children of the last level 2 heading } } /** * Generates a nested list of navigation links from the table of contents array. * @param {HTMLElement} ulElement – The unordered list element to populate. * @param {Array} headingArray – Array of heading objects. */ function generateList(ulElement, headingArray) { headingArray.forEach((heading, i) => { const li = document.createElement(‘li’); li.className = ‘estat-inpage-nav__list-item’; ulElement.appendChild(li); const link = `${heading.content}` if (heading.children.length > 0) { const containerDiv = document.createElement(‘div’) const button = `
Printing can have negative environmental impacts due to paper waste. We encourage you to explore eco-friendly alternatives. Bookmarking this page in your browser allows you to access it anytime.
This publication can also be converted to PDF, if you have a PDF printer installed on your computer. PDF printers function as virtual printers, enabling you to create digital copies of web pages and access the content offline.
{ const buttonPrintPage = document.getElementById(‘estat-print-page-modal-toggle’); const cookieSkipModal = ‘skipModalBeforePrinting’; if (configuration.displayInPageHeader) { const headerElement = document.querySelector(‘.ecl-page-header .ecl-page-header__meta’) || document.querySelector(‘.ecl-page-header .ecl-page-header__title-container ‘) if (headerElement) { headerElement.prepend(buttonPrintPage); headerElement.classList.add(‘ecl-u-width-100’) } } buttonPrintPage.addEventListener(‘click’, () => { const skipModal = readCookie(cookieSkipModal); if (skipModal == ‘true’) { window.print(); } else { const eclModalElement = document.getElementById(‘estat-print-page-modal’); const eclModal = ECL.components.get(eclModalElement); eclModal.openModal(); } }); document.getElementById(‘print-submit’).addEventListener(‘click’, () => { const skipModal = document.getElementById(‘checkbox-skip-modal’).checked if (skipModal) { writeCookieWithMaxAgeValue(cookieSkipModal, ‘true’, 15768000); } else { deleteCookie(cookieSkipModal); } window.print(); }); });;}());]]>
Up by 2.2% in the euro area and by 2.4% in the EU compared with July 2024
Overview
In July 2025, compared with June 2025, the seasonally adjusted retail trade volume decreased by 0.5% in the euro area and by 0.4% in the EU, according to first estimates from Eurostat, the statistical office of the European Union. In June 2025, retail trade volume grew by 0.6% in the euro area and by 0.5% in the EU.
In July 2025, compared with July 2024, the calendar adjusted retail sales index increased by 2.2% in the euro area and by 2.4% in the EU.
Monthly comparison by retail sector and by Member State
In the euro area in July 2025, compared with June 2025, the volume of retail trade
-
decreased for food, drinks, tobacco by 1.1%,
-
increased for non-food products (except automotive fuel) by 0.2%,
-
decreased for automotive fuel in specialised stores by 1.7%.
In the EU, the volume of retail trade
-
decreased for food, drinks, tobacco by 0.9%,
-
increased for non-food products (except automotive fuel) by 0.2%,
-
decreased for automotive fuel in specialised stores by 1.3%.
Among Member States for which data are available, the largest monthly decreases in the total retail trade volume were recorded in Croatia (-4.0%), Estonia (-2.0%) and Germany (-1.5%). The highest increases were observed in Lithuania (+1.5%), Latvia (+1.4%) and the Netherlands (+1.1%).
Annual comparison by retail sector and by Member State
In the euro area in July 2025, compared with July 2024, the volume of retail trade
-
increased for food, drinks, tobacco by 0.9%,
-
increased for non-food products (except automotive fuel) by 3.1%,
-
increased for automotive fuel in specialised stores by 2.3%.
In the EU, the volume of retail trade
-
increased for food, drinks, tobacco by 0.7%,
-
increased for non-food products (except automotive fuel) by 3.3%,
-
increased for automotive fuel in specialised stores by 3.3%.
Among Member States for which data are available, the highest annual increases in the total retail trade volume were recorded in Cyprus (+8.5%), Portugal (+6.1%) and Bulgaria (+6.0%). The only decrease was observed in Slovenia (-0.7%).
Tables
|
Volume of retail trade % change compared with the previous month* |
||||||
|---|---|---|---|---|---|---|
|
Feb-25 |
Mar-25 |
Apr-25 |
May-25 |
Jun-25 |
Jul-25 |
|
|
0.2 |
0.4 |
0.4 |
-0.3 |
0.6 |
-0.5 |
|
|
0.2 |
0.0 |
0.8 |
-0.4 |
0.6 |
-1.1 |
|
|
0.2 |
0.5 |
0.2 |
-0.1 |
0.6 |
0.2 |
|
|
0.5 |
0.8 |
1.3 |
-1.0 |
0.8 |
-1.7 |
|
|
0.2 |
0.2 |
1.0 |
-0.5 |
0.5 |
-0.4 |
|
|
0.1 |
-0.2 |
1.2 |
-0.6 |
0.4 |
-0.9 |
|
|
0.0 |
0.6 |
0.4 |
-0.2 |
0.6 |
0.2 |
|
|
1.4 |
0.5 |
1.4 |
-1.0 |
0.8 |
-1.3 |
|
Volume of retail trade % change compared with the previous month* |
||||||
|---|---|---|---|---|---|---|
|
Feb-25 |
Mar-25 |
Apr-25 |
May-25 |
Jun-25 |
Jul-25 |
|
|
0.2 |
0.4 |
0.4 |
-0.3 |
0.6 |
-0.5 |
|
|
0.2 |
0.2 |
1.0 |
-0.5 |
0.5 |
-0.4 |
|
|
0.4 |
1.4 |
2.1 |
-2.5 |
0.5 |
0.2 |
|
|
-1.6 |
1.4 |
-0.3 |
2.2 |
0.7 |
0.6 |
|
|
0.2 |
0.8 |
1.2 |
-0.5 |
0.3 |
c |
|
|
1.1 |
-0.1 |
0.3 |
0.5 |
-0.6 |
0.5 |
|
|
0.2 |
0.7 |
-0.1 |
-0.6 |
0.9 |
-1.5 |
|
|
2.3 |
-1.6 |
2.0 |
-2.5 |
1.0 |
-2.0 |
|
|
1.5 |
0.2 |
-0.3 |
0.6 |
0.7 |
0.2 |
|
|
1.8 |
0.4 |
0.7 |
-1.8 |
2.2 |
c |
|
|
1.4 |
0.0 |
0.8 |
0.3 |
1.2 |
-0.4 |
|
|
-0.3 |
0.4 |
0.7 |
0.0 |
0.0 |
0.0 |
|
|
-0.2 |
0.8 |
1.0 |
-1.5 |
3.6 |
-4.0 |
|
|
0.0 |
-0.2 |
0.5 |
c |
c |
c |
|
|
4.6 |
-0.3 |
0.6 |
1.0 |
0.9 |
0.0 |
|
|
-1.0 |
0.1 |
0.4 |
-0.7 |
0.8 |
1.4 |
|
|
0.8 |
1.3 |
1.7 |
0.3 |
0.9 |
1.5 |
|
|
11.9 |
2.8 |
0.2 |
0.6 |
-0.2 |
0.0 |
|
|
-0.6 |
-0.4 |
2.0 |
-1.4 |
0.5 |
-0.5 |
|
|
-0.7 |
2.6 |
-1.3 |
0.2 |
2.2 |
-0.1 |
|
|
-0.9 |
0.9 |
-0.7 |
-0.1 |
0.3 |
1.1 |
|
|
0.1 |
-0.1 |
0.5 |
-0.5 |
0.1 |
-0.3 |
|
|
-1.3 |
-0.8 |
7.7 |
-1.4 |
-0.8 |
0.1 |
|
|
0.3 |
-0.5 |
0.7 |
2.8 |
0.6 |
0.1 |
|
|
0.4 |
-0.3 |
0.1 |
-0.3 |
1.1 |
0.3 |
|
|
0.8 |
-1.4 |
0.6 |
0.6 |
-0.4 |
-1.0 |
|
|
-0.8 |
-0.8 |
2.4 |
-1.5 |
0.4 |
0.9 |
|
|
0.3 |
0.1 |
1.3 |
-2.5 |
0.4 |
0.8 |
|
|
-0.2 |
0.3 |
1.3 |
-3.9 |
2.5 |
0.7 |
|
|
0.0 |
0.7 |
0.6 |
0.1 |
0.1 |
0.6 |
|
|
-0.4 |
-0.2 |
-0.3 |
-0.7 |
1.9 |
-0.5 |
|
Volume of retail trade % change compared with the same month of the previous year* |
||||||
|---|---|---|---|---|---|---|
|
Feb-25 |
Mar-25 |
Apr-25 |
May-25 |
Jun-25 |
Jul-25 |
|
|
2.0 |
2.1 |
2.7 |
2.0 |
3.5 |
2.2 |
|
|
1.7 |
0.8 |
2.6 |
0.7 |
2.4 |
0.9 |
|
|
2.2 |
3.0 |
2.7 |
2.8 |
4.4 |
3.1 |
|
|
2.0 |
2.2 |
4.5 |
2.7 |
4.0 |
2.3 |
|
|
1.8 |
1.9 |
3.0 |
2.1 |
3.5 |
2.4 |
|
|
1.2 |
0.1 |
2.7 |
0.3 |
2.1 |
0.7 |
|
|
2.2 |
3.1 |
3.2 |
3.2 |
4.5 |
3.3 |
|
|
2.1 |
2.5 |
4.8 |
3.1 |
4.6 |
3.3 |
|
Volume of retail trade % change compared with the same month of the previous year* |
||||||
|---|---|---|---|---|---|---|
|
Feb-25 |
Mar-25 |
Apr-25 |
May-25 |
Jun-25 |
Jul-25 |
|
|
2.0 |
2.1 |
2.7 |
2.0 |
3.5 |
2.2 |
|
|
1.8 |
1.9 |
3.0 |
2.1 |
3.5 |
2.4 |
|
|
0.0 |
1.0 |
3.2 |
0.9 |
2.3 |
1.2 |
|
|
2.4 |
5.4 |
2.4 |
7.2 |
6.8 |
6.0 |
|
|
3.2 |
3.9 |
5.7 |
4.6 |
4.5 |
c |
|
|
3.2 |
2.4 |
3.1 |
4.2 |
2.2 |
2.9 |
|
|
4.2 |
3.6 |
3.1 |
2.6 |
4.8 |
1.8 |
|
|
5.2 |
1.2 |
6.2 |
2.4 |
5.0 |
0.6 |
|
|
2.2 |
2.1 |
0.7 |
2.0 |
4.0 |
3.1 |
|
|
5.6 |
0.3 |
6.9 |
-5.8 |
1.8 |
c |
|
|
3.8 |
3.8 |
4.2 |
4.9 |
6.5 |
4.6 |
|
|
1.7 |
2.6 |
3.3 |
3.2 |
3.7 |
3.0 |
|
|
2.8 |
3.7 |
5.0 |
2.6 |
7.4 |
1.4 |
|
|
-1.1 |
-1.3 |
0.2 |
c |
c |
c |
|
|
9.7 |
6.4 |
7.7 |
7.9 |
8.7 |
8.5 |
|
|
-0.9 |
-0.7 |
0.5 |
-1.4 |
1.5 |
1.7 |
|
|
2.1 |
0.6 |
4.6 |
2.3 |
4.6 |
5.1 |
|
|
5.8 |
7.6 |
8.3 |
6.5 |
4.4 |
3.2 |
|
|
3.3 |
0.8 |
4.9 |
2.0 |
3.0 |
1.8 |
|
|
0.2 |
7.6 |
0.3 |
-0.8 |
6.9 |
4.7 |
|
|
-0.7 |
1.1 |
0.9 |
0.0 |
1.7 |
2.7 |
|
|
2.0 |
2.1 |
1.3 |
0.8 |
4.1 |
0.4 |
|
|
-2.0 |
-3.0 |
6.3 |
4.0 |
3.1 |
2.9 |
|
|
4.4 |
3.9 |
3.0 |
5.3 |
5.6 |
6.1 |
|
|
4.2 |
2.6 |
2.6 |
2.3 |
2.8 |
4.8 |
|
|
4.2 |
0.3 |
0.7 |
2.5 |
2.8 |
-0.7 |
|
|
-1.4 |
-2.8 |
-0.1 |
-1.7 |
-0.4 |
0.1 |
|
|
-1.0 |
-1.5 |
2.5 |
-4.0 |
-1.2 |
0.1 |
|
|
-0.4 |
2.6 |
4.2 |
-1.4 |
2.2 |
2.9 |
|
|
2.3 |
3.1 |
4.3 |
0.1 |
4.3 |
5.1 |
|
|
1.8 |
1.6 |
0.8 |
0.0 |
4.0 |
0.7 |
|
Volume of retail trade, calendar and seasonally adjusted indices (base year 2021) |
||||||
|---|---|---|---|---|---|---|
|
Feb-25 |
Mar-25 |
Apr-25 |
May-25 |
Jun-25 |
Jul-25 |
|
|
101.8 |
102.2 |
102.6 |
102.3 |
102.9 |
102.4 |
|
|
102.2 |
102.4 |
103.4 |
102.9 |
103.4 |
103.0 |
|
|
92.1 |
93.4 |
95.4 |
93.0 |
93.5 |
93.7 |
|
|
114.7 |
116.3 |
115.9 |
118.5 |
119.3 |
120.0 |
|
|
98.1 |
98.9 |
100.1 |
99.6 |
99.9 |
c |
|
|
96.2 |
96.1 |
96.4 |
96.9 |
96.3 |
96.8 |
|
|
99.2 |
99.9 |
99.8 |
99.2 |
100.1 |
98.6 |
|
|
94.3 |
92.8 |
94.7 |
92.3 |
93.2 |
91.3 |
|
|
110.2 |
110.4 |
110.1 |
110.8 |
111.6 |
111.8 |
|
|
100.4 |
100.8 |
101.5 |
99.7 |
101.9 |
c |
|
|
109.4 |
109.4 |
110.3 |
110.6 |
111.9 |
111.4 |
|
|
104.6 |
105.0 |
105.7 |
105.7 |
105.7 |
105.7 |
|
|
114.6 |
115.5 |
116.7 |
115.0 |
119.1 |
114.3 |
|
|
97.7 |
97.5 |
98.0 |
c |
c |
c |
|
|
121.6 |
121.2 |
121.9 |
123.1 |
124.2 |
124.2 |
|
|
101.9 |
102.0 |
102.4 |
101.7 |
102.5 |
103.9 |
|
|
103.1 |
104.4 |
106.2 |
106.5 |
107.5 |
109.1 |
|
|
123.2 |
126.6 |
126.8 |
127.5 |
127.3 |
127.3 |
|
|
101.3 |
100.9 |
102.9 |
101.5 |
102.0 |
101.5 |
|
|
117.8 |
120.9 |
119.3 |
119.5 |
122.1 |
122.0 |
|
|
100.8 |
101.7 |
101.0 |
100.9 |
101.2 |
102.3 |
|
|
97.2 |
97.1 |
97.6 |
97.1 |
97.2 |
96.9 |
|
|
106.4 |
105.5 |
113.6 |
112.0 |
111.1 |
111.2 |
|
|
112.6 |
112.0 |
112.8 |
116.0 |
116.7 |
116.8 |
|
|
118.4 |
118.0 |
118.1 |
117.8 |
119.1 |
119.4 |
|
|
101.0 |
99.6 |
100.2 |
100.8 |
100.4 |
99.4 |
|
|
101.2 |
100.4 |
102.8 |
101.3 |
101.7 |
102.6 |
|
|
91.7 |
91.8 |
93.0 |
90.7 |
91.1 |
91.8 |
|
|
95.0 |
95.3 |
96.5 |
92.7 |
95.0 |
95.7 |
|
|
94.4 |
95.1 |
95.7 |
95.8 |
95.9 |
96.5 |
|
|
100.6 |
100.4 |
100.1 |
99.4 |
101.3 |
100.8 |
|
Volume of retail trade, calendar adjusted indices (base year 2021) |
||||||
|---|---|---|---|---|---|---|
|
Feb-25 |
Mar-25 |
Apr-25 |
May-25 |
Jun-25 |
Jul-25 |
|
|
90.1 |
100.5 |
99.2 |
101.9 |
103.3 |
101.4 |
|
|
90.1 |
100.9 |
100.3 |
102.6 |
103.8 |
102.5 |
|
|
82.0 |
93.1 |
93.6 |
94.7 |
96.6 |
94.2 |
|
|
99.9 |
111.3 |
112.4 |
115.5 |
118.9 |
125.7 |
|
|
84.6 |
96.3 |
96.4 |
98.8 |
100.0 |
c |
|
|
83.3 |
93.5 |
96.6 |
102.3 |
99.1 |
95.4 |
|
|
89.0 |
102.3 |
99.5 |
99.5 |
99.0 |
99.5 |
|
|
81.6 |
91.9 |
92.7 |
95.7 |
96.0 |
94.5 |
|
|
101.9 |
101.1 |
101.6 |
107.5 |
117.1 |
102.5 |
|
|
94.1 |
96.0 |
99.3 |
97.9 |
104.0 |
c |
|
|
95.5 |
105.1 |
105.5 |
109.3 |
114.3 |
120.3 |
|
|
92.4 |
102.7 |
102.7 |
103.8 |
105.9 |
88.4 |
|
|
91.1 |
106.4 |
112.1 |
116.4 |
127.4 |
141.2 |
|
|
86.1 |
92.7 |
88.4 |
c |
c |
c |
|
|
106.7 |
116.3 |
118.5 |
120.1 |
125.7 |
131.3 |
|
|
87.3 |
100.1 |
98.6 |
102.6 |
103.9 |
108.8 |
|
|
88.5 |
102.3 |
104.3 |
110.3 |
109.2 |
113.6 |
|
|
112.5 |
129.8 |
123.2 |
129.4 |
128.5 |
132.9 |
|
|
87.7 |
98.9 |
100.5 |
101.4 |
103.6 |
104.1 |
|
|
98.8 |
115.8 |
115.8 |
122.1 |
124.7 |
130.6 |
|
|
88.5 |
101.6 |
99.4 |
104.6 |
103.0 |
104.7 |
|
|
87.4 |
98.7 |
98.8 |
95.5 |
97.5 |
98.3 |
|
|
94.9 |
108.4 |
113.8 |
110.4 |
108.1 |
112.3 |
|
|
96.9 |
106.7 |
105.7 |
114.0 |
111.9 |
124.6 |
|
|
101.7 |
113.5 |
116.6 |
116.6 |
118.6 |
124.4 |
|
|
88.9 |
101.0 |
100.1 |
100.3 |
102.5 |
102.5 |
|
|
91.5 |
100.1 |
100.9 |
102.1 |
102.8 |
102.6 |
|
|
76.6 |
87.9 |
90.8 |
94.8 |
97.4 |
98.2 |
|
|
80.1 |
93.4 |
96.1 |
98.7 |
101.1 |
99.0 |
|
|
79.4 |
90.8 |
91.4 |
103.1 |
101.6 |
96.0 |
|
|
89.4 |
101.3 |
96.5 |
101.1 |
100.9 |
100.0 |
Notes for users
Revisions and timetable
Data of previous months have been revised compared to those issued in the News Release of 6 August 2025. The monthly percentage change for June 2025 has been revised from +0.3% to +0.6% in the euro area and from +0.3% to +0.5% in the EU. The annual percentage change has been revised from +3.1% to +3.5% in both the euro area and the EU.
Methods and definitions
The index of the volume of retail trade measures the evolution of the turnover in retail trade, adjusted for price changes (deflated), i.e. the evolution of the total amount of goods sold, based on data adjusted for calendar and seasonal effects.
Seasonally adjusted euro area and EU series are calculated by aggregating the seasonally adjusted national data.
Geographical information
The euro area (EA20) includes Belgium, Germany, Estonia, Ireland, Greece, Spain, France, Croatia, Italy, Cyprus, Latvia, Lithuania, Luxembourg, Malta, the Netherlands, Austria, Portugal, Slovenia, Slovakia and Finland.
The European Union (EU27) includes Belgium, Bulgaria, Czechia, Denmark, Germany, Estonia, Ireland, Greece, Spain, France, Croatia, Italy, Cyprus, Latvia, Lithuania, Luxembourg, Hungary, Malta, the Netherlands, Austria, Poland, Portugal, Romania, Slovenia, Slovakia, Finland and Sweden.
For more information
Share the release
Share component will be rendered here.
<![CDATA[(function() {var fragmentElement = document.querySelector('#fragment-18488078-dnmj'); var configuration = {};/** * Executed when the html document is loaded * @param {*} print – true if the users clicks on the "Print" button within the Editor, * false if the user clicks on "Preview" button */ function load(print) { /** We open the printer options */ if (print) { printDocument(); } /** We adapt the structure of the tables */ tableConfiguration(); /** We configure the tables in order to make them sortable */ setDynamicTables(); /** We configure the charts, converting the images to dynamic charts */ setDynamicCharts(); } /** * Opens the Printer options in order to print the html document */ function printDocument() { window.print(); } /** * Configures the tables according to the expected structure given by Regine * *
‘; /** Retrieve the order from the tooltip option */ const sortOrder = option.tooltip.order; /** Sort the ‘params’ array based on the ‘sortOrder’ parameter. */ switch (sortOrder) { /** Sort by series name in ascending order. */ case ‘seriesAsc’: params = params.sort((a, b) => a.seriesName.localeCompare(b.seriesName)); break; /** Sort by series name in descending order. */ case ‘seriesDesc’: params = params.sort((a, b) => b.seriesName.localeCompare(a.seriesName)); break; /** Sort by numerical value in ascending order. */ case ‘valueAsc’: params = params.sort((a, b) => parseFloat(a.value) – parseFloat(b.value)); break; /** Sort by numerical value in descending order. */ case ‘valueDesc’: params = params.sort((a, b) => parseFloat(b.value) – parseFloat(a.value)); break; /** Reverse the current order. */ case ‘reverse’: params.reverse(); break; default: break; } /** Iterate over each series in the tooltip parameters */ for (const param of params) { /** Retrieve the name and value of the current series */ let seriesName = param.seriesName; let value = param.value; /** Replace every specific apostrphe by simple one. */ seriesName = seriesName.replaceAll(“’”, “‘”); /** Convert the numeric value to its string representation. */ const strValue = String(value); /** Retrieve the axis used as value */ const axis = option.yAxis.type === ‘value’ ? option.yAxis : option.xAxis; /** Initialize the number of decimal places */ let decimals = option.tooltip.decimals; /** Check if decimals configuration is set to default and the value contains decimal places */ if (!decimals && strValue.indexOf(‘.’) > -1) { /** Calculate the number of decimal places */ decimals = strValue.substring(strValue.indexOf(‘.’), strValue.length – 1).length; } else { /** If there are no decimal places, format the value with 1 decimal place */ decimals = decimals || 1; /** Convert the value to a fixed-point notation string with a specified number of decimal places. */ value = Number(value).toFixed(decimals); } /** Convert -0 value to 0 with the specified or calculated number of decimal places.*/ if (Number(value) == -0) { value = (Number(value) + 0).toFixed(decimals); } /** Extract the unit from within the axis label */ const unit = axis.axisLabel.unit ? axis.axisLabel.unit : ”; /** Format the value using the appropriate number of decimal places */ if (isNaN(value)) { value = ‘N/A’; } else { value = Number(value).toLocaleString(option.lang ? option.lang : ‘en’, { minimumFractionDigits: decimals }) + unit; } /** Retrieve the color of the current series */ const color = param.color; /** * Add the series name and value to the tooltip content * Use a circle icon with the series color */ tooltipContent += ‘
‘ + ” + ” + ” + seriesName + ” + ” + ” + value + ” + ‘
‘; } /** Close the tooltip content container */ tooltipContent += ”; /** Return the formatted tooltip content */ return tooltipContent; } } /* * This content is licensed according to the W3C Software License at * https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document * * File: sortable-table.js * * Desc: Adds sorting to a HTML data table that implements ARIA Authoring Practices */ class SortableTable { constructor(tableNode) { this.tableNode = tableNode; this.columnHeaders = tableNode.querySelectorAll(‘thead th.sortable’); this.sortColumns = []; for (let i = 0; i b.value ? -1 : 1; } } else if (isNumber) { return a.value – b.value; } else { return a.value
Subscribe to receive the latest Eurostat Euro indicators releases
{ if (document.querySelector(selector)) { return resolve(document.querySelector(selector)); } const observer = new MutationObserver(mutations => { if (document.querySelector(selector)) { resolve(document.querySelector(selector)); observer.disconnect(); } }); observer.observe(document.body, { childList: true, subtree: true }); }); } waitForElm(‘div.chart’).then((elm) => { // Has to be run after cool-ngx-editor.js script that is tweeking the charts const elements = document.getElementsByClassName(“chart”); for (let i = 0; i setTimeout(r, 500)); // Wait a bit so that it doesn’t scroll too far allItems[position].scrollIntoView(true); } } });;}());]]>
The post Volume of retail trade down by 0.5% in the euro area and by 0.4% in the EU appeared first on Bulgarian-Chinese Chamber of Commerce and industry.