"Best practice" is usually short hand for "whatever matches my prejudices". It's not an objective evaluation, and specific cases may require a departure from best practice...
So, here are my prejudices.
Firstly - work with whatever your framework is, and use the accepted style of development. This makes it easier to understand the application, and that's usually the biggest contribution to "best practice".
The second recommendation is "don't repeat yourself" (also known as DRY). Work out which bit of logic is responsible for calculating total price, and don't let other code repeat it.
The whole point of MVP/MVC frameworks is that domain logic lives in the controller; this is a reaction to unstructured applications which were hard to maintain because the domain logic got spread all over the architecture, and made it hard to debug, test and understand.
In your case, imagine your "total price" evolves over time to include tax calculations. And shipping costs. And discounts based on volume pricing. Also imagine you want to write automated unit tests to verify your total price calculation is correct. That's really hard to do if that one bit of logic is hidden in the controller/presenter layers.
All this is a reason to put the price calculation in the domain layer, and call it from the front-end as and when you need it.
There are exceptions to this rule - usually driven by performance and responsiveness considerations. If you want to provide rapid feedback to the user when they enter values in a form, the server roundtrip may be too slow, so it may make sense to duplicate some logic on the client. This is often the case with form validation logic. However - this introduces duplication, which is a maintenance burden - so only do it if you know you have a performance problem, and cannot solve it in any other way.