Thanks for the comments guys. Pretty much confirmed what I've already ended up doing earlier today as the only path. I thought I'd let everyone know here if they're after a solution.
Below is the query to return both the user's currency preferences, if available, and the base currency. For this particular scenario I'm not interested in the records' currencies as they could potentially vary from one record to the other and so cannot be aggregated, but as Diana pointed out you can grab the currency related to a record if you wish.
<fetch>
<entity name="usersettings" >
<attribute name="systemuserid" />
<filter>
<condition attribute="systemuserid" operator="eq-userid" />
</filter>
<link-entity name="transactioncurrency" from="transactioncurrencyid" to="transactioncurrencyid" link-type="outer" alias="usercurrency" >
<attribute name="currencysymbol" />
<attribute name="currencyprecision" />
<attribute name="isocurrencycode" />
<attribute name="exchangerate" />
<attribute name="currencyname" />
</link-entity>
<link-entity name="systemuser" from="systemuserid" to="systemuserid" link-type="outer" alias="user" >
<attribute name="fullname" />
<link-entity name="organization" from="organizationid" to="organizationid" link-type="outer" alias="userorg" >
<attribute name="basecurrencyprecision" />
<attribute name="basecurrencysymbol" />
<attribute name="name" />
<attribute name="basecurrencyid" />
</link-entity>
</link-entity>
</entity>
</fetch>
So what I have from this is:
Base
User
- Symbol
- Precision
- Exchange Rate
You can then add the "base" (all currency fields have a calculated base field added) columns to the view, or use addColumn to ensure the field is in the dataset:
context.parameters.dataset.addColumn([currencyfield + '_base']);
Then I get the unformatted value of the column to do whatever aggregation/maths I need using the base amount, or by taking the value of the base field times by the user's exchange rate I retrieved earlier. In this case I want to be able to switch between the base and users currency.
Finally I pass out the formatted value.
context.formatting.formatCurrency(100, 2, $)
I was really hoping that somewhere in the dataset info this would have been available already considering what else is already there.