-
Notifications
You must be signed in to change notification settings - Fork 5
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feature/currency-change-bug #367
base: develop
Are you sure you want to change the base?
Conversation
The latest updates on your projects. Learn more about Vercel for Git ↗︎
|
@@ -27,6 +27,7 @@ export function formatAmountForStripe( | |||
style: "currency", | |||
currency, | |||
currencyDisplay: "symbol", | |||
maximumSignificantDigits: 21, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This change leads to returning an amount of 200 for e.g. 200€ (in fact all amounts having no decimal values) instead of 20000 (amount calculated in sub currency "Cent") as before. So probably only 2€ would get billed using native payments as Google or Apple Pay now, compare https://stripe.com/docs/js/appendix/payment_item_object.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As some currencies do not return a decimal part for numberFormat.formatToParts(amount)
, we might should consider rounding the result every time for this method, e.g. return zeroDecimalCurrency ? Math.round(amount) : Math.round(amount * 100);
, but I am not sure if for AFN we would then try to bill factor 100 less then expected. We should clarify how to deal correctly with currencies like Afghani or Japanese yen in this method.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@norbertschuler I wonder if we should use formatToParts
to detect if the currency is a zero decimal currency. Sometimes, the results aren't as expected.
For example, stripe does not consider AFN a zero decimal currency, but the previous logic does.
const numberFormat = new Intl.NumberFormat(["en-US"], {
style: "currency",
currency,
currencyDisplay: "symbol",
});
const parts = numberFormat.formatToParts(amount);
let zeroDecimalCurrency = true;
parts.forEach((part) => {
if (part.type === "decimal") {
zeroDecimalCurrency = false;
}
});
return zeroDecimalCurrency ? amount : Math.round(amount * 100); //zeroDecimalCurrency is true for AFN.
Would it be better to keep a list of currency exceptions that are handled separately, and do Math.round(amount * 100)
for the rest?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I agree that if Stripe and Intl.NumberFormat differ they should not be used together to decide how to format the amount for Stripe.
Currently unable to reproduce this issue, should we close this? |
Issue is browser dependent. Firefox does not have the issue. |
Loom.Message.-.10.January.2023.mp4