Skip to content

[Due for payment 2026-01-09] [$250] Create expense - Some currencies show the name and some show the currency signs before entering the amount #75709

Closed

Description

@lanitochka17

If you haven’t already, check out our contributing guidelines for onboarding and email contributors@expensify.com to request to join our Slack channel!


Version Number: 9.2.61
Reproducible in staging?: Y
Reproducible in production?: Y
If this was caught during regression testing, add the test name, ID and link from TestRail: N/A
Email or phone of affected tester (no customers): mootuswami698@gmail.com
Issue reported by: Applause - Internal Team

Action Performed:

  1. Go to https://staging.new.expensify.com
  2. Click on Report
  3. Click on Create expense
  4. Select some currencies

Expected Result:

All currencies must display currency signs before entering the amount

Actual Result:

Some currencies show the name and some show the currency signs

Workaround:

Unknown

Platforms:

Select the officially supported platforms where the issue was reproduced:

  • Android: App
  • Android: mWeb Chrome
  • iOS: App
  • iOS: mWeb Safari
  • iOS: mWeb Chrome
  • Windows: Chrome
  • MacOS: Chrome / Safari
  • MacOS: Desktop
Platforms Tested: On which of our officially supported platforms was this issue tested:
  • Android: App
  • Android: mWeb Chrome
  • iOS: App
  • iOS: mWeb Safari
  • iOS: mWeb Chrome
  • Windows: Chrome
  • MacOS: Chrome / Safari
  • MacOS: Desktop

Screenshots/Videos

Add any screenshot/video evidence
Bug7000650_1762872539493.bandicam_2025-11-11_20-04-07-229.mp4

View all open jobs on GitHub

Upwork Automation - Do Not Edit
  • Upwork Job URL: https://www.upwork.com/jobs/~021996314749314410515
  • Upwork Job ID: 1996314749314410515
  • Last Price Increase: 2025-12-10
Issue OwnerCurrent Issue Owner: @muttmuure

Activity

  1. added
    BugSomething is broken. Auto assigns a BugZero manager.
    on Nov 20, 2025
  2. melvin-bot commented on Nov 20, 2025

    @melvin-bot

    Triggered auto assignment to @muttmuure (Bug), see https://stackoverflow.com/c/expensify/questions/14418 for more details. Please add this bug to a GH project, as outlined in the SO.

  3. thedavos commented on Nov 21, 2025

    @thedavos
    Contributor

    🚨 Edited by proposal-police: This proposal was edited at 2025-12-12 14:50:34 UTC.

    Proposal

    Please re-state the problem that we are trying to solve in this issue.

    In the Create expense flow, when the user selects a currency and sees the amount input:

    • Some currencies show a currency sign/symbol before entering the amount.
    • Other currencies show a text value (like the currency code/name) instead of a symbol.

    We want to show the currency symbol when we have one, and otherwise keep the existing localized display behavior, so the prefix is as clear and consistent as possible across devices.

    What is the root cause of that problem?

    The amount input uses MoneyRequestAmountInput, which in turn sets the symbol by calling:

    getLocalizedCurrencySymbol(currencyCode)

    getLocalizedCurrencySymbol relies on Intl.NumberFormat via formatToParts and IntlStore.getCurrentLocale() to extract the currency part.

    For some currencies and locales, Intl.NumberFormat does not return a dedicated symbol and instead returns the currency code/name (e.g. CLP, COP, etc.). This means:

    • Some currencies render as a symbol.
    • Some render as a code/name.
    • The behavior can also vary by browser/OS support.

    At the same time, the app already has a canonical currency list in Onyx (CURRENCY_LIST), where each currency entry includes a symbol field. This list is what we use in other parts of the app to represent currencies consistently.

    So the root cause is:
    We are relying on Intl (via getLocalizedCurrencySymbol) to derive the prefix symbol in MoneyRequestAmountInput, instead of using the existing CURRENCY_LIST.symbol, which leads to inconsistent display between currencies and environments.

    What changes do you think we should make in order to solve the problem?

    I propose that we stop depending solely on getLocalizedCurrencySymbol for the amount input symbol and instead use the currency symbol from CURRENCY_LIST.

    Concretely:

    1. Read the symbol from CURRENCY_LIST in the Create expense step container
      In IOURequestStepAmount (the step that renders MoneyRequestAmountInput for Create expense), we already have access to Onyx hooks.
      We can read the full currency list from Onyx and derive the symbol for the currently selected currency, for example:
    • Get currencyList from ONYXKEYS.CURRENCY_LIST.
    • Compute currencySymbol from currencyList[currency].symbol.
    • Else use the existing getLocalizedCurrencySymbol(currency) fallback (so locale-specific currency text remains possible)
    // IOURequestStepAmount.tsx
    const [currencyList] = useOnyx(ONYXKEYS.CURRENCY_LIST, {canBeMissing: false});
    const currencySymbol = currencyList?.[currency]?.symbol ?? getLocalizedCurrencySymbol(currency);
    
    <MoneyRequestAmountForm
        isEditing={!!backTo || isEditing}
        currency={currency}
        currencySymbol={currencySymbol}
        amount={transactionAmount}
        skipConfirmation={shouldSkipConfirmation ?? false}
        iouType={iouType}
        policyID={policy?.id}
        ref={(e: BaseTextInputRef | null) => {
            textInput.current = e;
        }}
        shouldKeepUserInput={transaction?.shouldShowOriginalAmount}
        onCurrencyButtonPress={navigateToCurrencySelectionPage}
        onSubmitButtonPress={saveAmountAndCurrency}
        allowFlippingAmount={!isSplitBill && allowNegative}
        selectedTab={iouRequestType as SelectedTabRequest}
        chatReportID={reportID}
    />
    1. Pass the computed symbol into MoneyRequestAmountInput
    • Extend MoneyRequestAmountInput to accept a prop for the symbol (e.g. symbol or currencySymbol).
    • If this prop is provided, MoneyRequestAmountInput should pass that value to NumberWithSymbolForm instead of calling getLocalizedCurrencySymbol.
    • If the prop is not provided, we can keep the current behavior as a fallback (using getLocalizedCurrencySymbol) to avoid breaking other call sites.
    const symbol = currencySymbol ?? getLocalizedCurrencySymbol(currency);
    
    <NumberWithSymbolForm
                value={onFormatAmount(amount, currency)}
                decimals={decimals}
                onSymbolButtonPress={onCurrencyButtonPress}
                onInputChange={onAmountChange}
                ...
                symbol={symbol}
                ...
            />
    1. Ensure consistent prefix behavior

    With this change, the symbol shown before entering the amount on the Create expense screen will always come from CURRENCY_LIST.symbol, so all supported currencies will:

    • Display a consistent sign.
    • No longer depend on Intl differences between devices.

    What alternative solutions did you explore? (Optional)

    None.

    Reminder: Please use plain English, be brief and avoid jargon. Feel free to use images, charts or pseudo-code if necessary. Do not post large multi-line diffs or write walls of text. Do not create PRs unless you have been hired for this job.

  4. abbasifaizan70 commented on Nov 21, 2025

    @abbasifaizan70
    Contributor

    Proposal

    Please re-state the problem that we are trying to solve in this issue.

    When creating an expense and selecting different currencies, some currencies display currency symbols (like $, €, ₹) while others display currency codes (like INR, JPY, RSD) in the amount input field. This creates an inconsistent user experience.

    What is the root cause of that problem?

    The currency selection list uses getCurrencySymbol() to display symbols, but the amount input components use getLocalizedCurrencySymbol(). The getLocalizedCurrencySymbol() function relies on the browser's Intl API, which may return the currency code itself when a proper symbol isn't available, causing the inconsistency.

    What changes do you think we should make in order to solve the problem?

    Replace getLocalizedCurrencySymbol() with getCurrencySymbol() in both amount input components to ensure all currency symbols are retrieved from the same source.

    1. Update MoneyRequestAmountInput.tsx

    https://github.com/Expensify/App/blob/main/src/components/MoneyRequestAmountInput.tsx

    Change the import on line 4:

    // From:
    import {convertToFrontendAmountAsString, getCurrencyDecimals, getLocalizedCurrencySymbol} from '@libs/CurrencyUtils';
    
    // To:
    import {convertToFrontendAmountAsString, getCurrencyDecimals, getCurrencySymbol} from '@libs/CurrencyUtils';

    Change the symbol prop on line 226:

    // From:
    symbol={getLocalizedCurrencySymbol(currency) ?? ''}
    
    // To:
    symbol={getCurrencySymbol(currency) ?? ''}

    2. Update AmountForm.tsx

    https://github.com/Expensify/App/blob/main/src/components/AmountForm.tsx

    Change the import on line 4:

    // From:
    import {getCurrencyDecimals, getLocalizedCurrencySymbol} from '@libs/CurrencyUtils';
    
    // To:
    import {getCurrencyDecimals, getCurrencySymbol} from '@libs/CurrencyUtils';

    Change the symbol prop on line 90:

    // From:
    symbol={getLocalizedCurrencySymbol(currency) ?? ''}
    
    // To:
    symbol={getCurrencySymbol(currency) ?? ''}

    What alternative solutions did you explore? (Optional)

    An alternative would be to update CurrencySelectionList to use getLocalizedCurrencySymbol() instead, but this would be less reliable since it depends on browser support and could show different symbols for different users based on their browser/locale settings.

  5. melvin-bot commented on Nov 28, 2025

    @melvin-bot

    @muttmuure Still overdue 6 days?! Let's take care of this!

  6. added
    ExternalAdded to denote the issue can be worked on by a contributor
    on Dec 3, 2025
  7. changed the title [-]Create expense - Some currencies show the name and some show the currency signs before entering the amount[/-] [+][$250] Create expense - Some currencies show the name and some show the currency signs before entering the amount[/+] on Dec 3, 2025
  8. melvin-bot commented on Dec 3, 2025

    @melvin-bot
  9. added
    Help WantedApply this label when an issue is open to proposals by contributors
    on Dec 3, 2025
  10. melvin-bot commented on Dec 3, 2025

    @melvin-bot

    Triggered auto assignment to Contributor-plus team member for initial proposal review - @parasharrajat (External)

  11. 43 remaining items

  12. melvin-bot commented on Jan 2, 2026

    @melvin-bot

    @parasharrajat The PR fixing this issue has been merged! The following checklist (instructions) will need to be completed before the issue can be closed. Please copy/paste the BugZero Checklist from here into a new comment on this GH and complete it. If you have the K2 extension, you can simply click: [this button]

  13. melvin-bot commented on Jan 9, 2026

    @melvin-bot

    Issue is ready for payment but no BZ is assigned. @lydiabarclay you are the lucky winner! Please verify the payment summary looks correct and complete the checklist. Thanks!

  14. lydiabarclay commented on Jan 10, 2026

    @lydiabarclay
    Contributor

    Payment Summary

    Contributor: @thedavos paid $250 via Upwork
    Contributor+: @parasharrajat due $250 via NewDot

    ✅ No regression test necessary

  15. lydiabarclay commented on Jan 10, 2026

    @lydiabarclay
    Contributor

    @parasharrajat can you please fill out the bz checklist

  16. changed the title [-][Due for payment 2026-01-09] [Due for payment 2026-01-07] [$250] Create expense - Some currencies show the name and some show the currency signs before entering the amount[/-] [+][Due for payment 2026-01-09] [$250] Create expense - Some currencies show the name and some show the currency signs before entering the amount[/+] on Jan 10, 2026
  17. parasharrajat commented on Jan 10, 2026

    @parasharrajat
    Member

    @lydiabarclay We don't need this change so no checklist here.

  18. parasharrajat commented on Mar 19, 2026

    @parasharrajat
    Member

    Payment requested as per #75709 (comment)

  19. twisterdotcom commented on Mar 23, 2026

    @twisterdotcom
    Contributor

    Confirming Payment Summary. @parasharrajat paid via New Expensify

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

Metadata

Metadata

Labels

Awaiting PaymentAuto-added when associated PR is deployed to productionBugSomething is broken. Auto assigns a BugZero manager.DailyKSv2ExternalAdded to denote the issue can be worked on by a contributor

Type

No type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions