Skip to content
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

Open
wants to merge 3 commits into
base: develop
Choose a base branch
from

Conversation

prachigarg19
Copy link
Collaborator

Loom.Message.-.10.January.2023.mp4

@vercel
Copy link

vercel bot commented Jan 17, 2023

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Comments Updated
donate-with-planet ✅ Ready (Inspect) Visit Preview 💬 Add your feedback Jan 27, 2023 at 0:20AM (UTC)

@@ -27,6 +27,7 @@ export function formatAmountForStripe(
style: "currency",
currency,
currencyDisplay: "symbol",
maximumSignificantDigits: 21,
Copy link
Collaborator

@norbertschuler norbertschuler Jan 29, 2023

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.

Copy link
Collaborator

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.

Copy link
Contributor

@mohitb35 mohitb35 Jan 30, 2023

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?

Copy link
Collaborator

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.

@mariahosfeld
Copy link
Contributor

Currently unable to reproduce this issue, should we close this?

@mariahosfeld
Copy link
Contributor

Issue is browser dependent. Firefox does not have the issue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants