I have an exercise where the answers are very large currency amounts, in the millions or billions of dollars. I am using the Currency context for this exercise. I thought it would be nice to let students type something like $432M or $0.432B instead of $432000000. So I added some constants to the context:
Context()->constants->add(
B => 10**9,
M => 10**6,
K => 10**3
);
That is enough to let me create currency objects in this way:
$ans = Currency("$432 M");
However it's not enough to let students enter "$432 M" or "$0.432B". If they submit "$432M", there is an error:
Can't convert a real number to a monetary value
I have only been able to get past this by passing promoteReals => 1 to the cmp() routine. And this is progress, because then "$432M" is accepted.
I still can't submit "$0.432B" or I get:
Monetary values must have exactly two decimal places
But I can address that with the flag:
noExtraDecimals => 0
This is almost what I want. Except that since I am using promoteReals => 1, the students can enter answers without a dollar sign. I'd prefer to still require the currency symbol and give the usual message about the answer not being a currency when the currency symbol is omitted.
Big picture: is there a better way to get things like "B", "M", and "K" to work as I'd like them to in the currency context?
Focusing on what I've tried: can my approach be adjusted to require the dollar sign, but get past the "Can't convert a real number to a monetary value" issue?