Streamlining your tech stack for maximum efficiency

Learn, explore, and grow with our knowledge hub.

Power Apps Decimal Input for International Teams | Smart Statistics
Power Apps practical tutorial

Power Apps Decimal Input for International Teams: Support Commas and Full Stops Safely

A UK finance app can fail quietly when one colleague enters 1250.50 and another expects 1250,50. This tutorial keeps the field numeric-only, respects each user's locale and stores one dependable number.

International expense-entry control
Illustrative example
Input language en-GB Illustrative example
Decimal convention 1,250.50 Illustrative example
Stored numeric value 1250.50 Illustrative example
Validation state Valid Illustrative example
Enter
Numeric-only convention for United Kingdom. Illustrative example.
Validate
Numeric value accepted
Range £0.00–£1,000,000.00; precision 2. Illustrative example.
Store
1250.50 One numeric value, no punctuation stored. Illustrative example.

Why this matters

The punctuation is presentation; the value is business data

A decimal separator looks like a small interface choice. In practice it can change totals, tax calculations, approval thresholds and Power BI measures.

Locale is ignored

The app assumes every user types a full stop, so a colleague with a comma-decimal keyboard cannot enter a familiar value cleanly.

Numbers become text

A formatted string may look right on screen but sorts, aggregates and exports incorrectly. The defect appears downstream, not at entry.

Ambiguity is normalised blindly

Replacing punctuation without a locale rule can make 1.250 mean 1.25 in one country and 1,250 in another.

What good looks like

Input language → numeric validation → numeric storage → locale-aware display. Microsoft documents that the modern Number Input exposes a numeric Value, supports precision, min/max validation and a ContentLanguage property. That makes it the right default for controlled amounts, quantities and percentages.

Hands-on build

Configure a safe decimal field in seven steps

The example uses a modern Number Input named numNetAmount, a numeric data-source column named NetAmount and two supported language paths: en-GB and pt-PT.

1. Define the numeric contract before the control

Record the business meaning, column type, precision, permitted range, blank rule, negative-value rule and supported languages. For an expense amount, a sensible contract might be: currency column, two decimals, £0–£1,000,000, required, no negatives, en-GB and pt-PT.

2. Map each user to an approved input language

Language() returns the current user's language tag. Map it to the locales the app has actually been designed and tested to support. Do not accept arbitrary regional variants without a test route.

// App.OnStart or screen.OnVisible
Set(
    varInputLanguage,
    If(
        StartsWith(Language(), "pt"),
        "pt-PT",
        "en-GB"
    )
);

3. Configure the modern Number Input

Set the properties below on numNetAmount. A Portuguese user sees and enters a comma decimal; a UK user sees and enters a full stop. The output remains the numeric numNetAmount.Value.

// numNetAmount properties
ContentLanguage = varInputLanguage
Precision       = DecimalPrecision.'2'
Min             = 0
Max             = 1000000
Step            = 0.01
AccessibleLabel = "Net amount in pounds, to two decimal places"

Microsoft states that the control's OnChange fires when focus leaves the field or when a step button is used—not on every keystroke. Put save-time validation on the submit action as well as visual feedback on the control.

4. Make validation visible and accessible

Use the control's validation state and a nearby label. Avoid relying on border colour alone; give people a clear message that a screen reader can announce.

// numNetAmount.ValidationState
If(
    IsBlank(numNetAmount.Value) ||
    numNetAmount.Value < 0 ||
    numNetAmount.Value > 1000000,
    ValidationState.Error,
    ValidationState.None
)

// lblNetAmountError.Text
"Enter an amount from 0.00 to 1,000,000.00"

// lblNetAmountError.Visible
numNetAmount.ValidationState = ValidationState.Error

5. Save the numeric value, not the formatted string

Patch .Value into a numeric or currency column. Round at the agreed storage boundary, not repeatedly during intermediate calculations.

If(
    IsBlank(numNetAmount.Value) ||
    numNetAmount.Value < 0 ||
    numNetAmount.Value > 1000000,
    Notify(
        "Check the net amount before saving.",
        NotificationType.Error
    ),
    Patch(
        Expenses,
        Defaults(Expenses),
        {
            NetAmount: Round(numNetAmount.Value, 2),
            TaxAmount: Round(Coalesce(numTaxAmount.Value, 0), 2)
        }
    )
)

6. Separate calculation from display

Calculate with numbers. Use Coalesce when a genuinely optional numeric value should behave as zero, then apply Text only in a read-only label.

// Numeric calculation
With(
    {
        NetValue: Coalesce(numNetAmount.Value, 0),
        TaxValue: Coalesce(numTaxAmount.Value, 0)
    },
    NetValue + TaxValue
)

// Read-only label: fixed GBP, user's separators
Text(
    Coalesce(varTotalAmount, 0),
    "[$-en-GB]£#,##0.00",
    Language()
)

The format-language placeholder tells Power Fx how to interpret the format string; the third argument tells it how the result should appear for the user.

7. Run the locale and boundary test matrix

Test with accounts whose language settings actually follow each route. Confirm the value both before and after save, then compare the underlying data-source value with the displayed label.

User route Entered value Expected numeric value Expected result Reason
en-GB 1250.50 1250.50 Accept Full stop is the configured decimal separator.
pt-PT 1250,50 1250.50 Accept Comma is the configured decimal separator.
Either route Blank Blank Block The example's business rule makes the amount required.
Either route -0.01 None Block Below the permitted minimum.
Either route 1000000.01 None Block Above the permitted maximum.
Either route Three decimal places None or controlled rounding Verify Behaviour must match the agreed two-decimal contract.

Decision criteria

Use the simplest control that protects the meaning

Choose the entry pattern by data risk, not visual preference.

Use modern Number Input when…

  • The field must remain numeric-only.
  • You need min/max boundaries and controlled precision.
  • Each session can use one known ContentLanguage.
  • The output should be patched directly as a number.

Stop and redesign when…

  • A single user must switch conventions inside one session.
  • Values arrive pasted with unknown grouping separators.
  • Currency and unit are mixed into the same field.
  • The destination column is text but the business meaning is numeric.

Governance and ownership

Make decimal handling a controlled design decision

The best-practice pattern survives release because ownership, tests and measures are explicit.

Business owner

Defines the meaning, range, precision, whether blank is allowed and when rounding happens.

App owner

Maintains locale mapping, control properties, accessible errors, data-source types and regression tests.

Service owner

Monitors validation failures, abandoned submissions, correction rates and downstream reconciliation differences.

Measure business impact

Track invalid-entry rate, save success by locale, finance correction rate, time to complete, duplicate resubmissions and differences between app totals and the system of record. A good release reduces rework without shifting errors downstream.

Readiness assessment

Is your decimal input ready for international users?

Tick each control you already have. The score updates locally in the browser and does not submit data.

Frequently asked questions

Power Apps decimal input FAQs

Should a Power Apps decimal field be stored as text?

No. Store the value in a numeric or currency column. Formatting belongs in the user interface; storing formatted text makes calculation, sorting, aggregation and Power BI reporting less reliable.

How does Power Apps know whether a comma or full stop is the decimal separator?

The modern Number Input control uses its ContentLanguage setting. Set that property to an approved language tag, normally derived from Language(), so a UK user can enter a full stop and a comma-decimal user can use their familiar convention.

Can one numeric field accept both separators at the same time?

Do not make that the default. A string such as 1.250 is ambiguous across locales. Select one input language for each user session, keep the control numeric-only and test the supported locale paths.

What should be tested before release?

Test every supported locale, decimal precision, minimum and maximum values, blank behaviour, negative numbers where relevant, calculation totals, saved column types and the read-only display format on desktop and mobile.

Does changing ContentLanguage translate the whole app?

No. ContentLanguage controls the language used for the input text. Labels, help text and messages still need a separate localisation approach, while Text can format read-only numbers for the user's display language.

Technical references

Current Microsoft documentation used

Technical claims were checked against Microsoft Learn on 12 October 2026. The business examples and dashboard figures in this article are illustrative.

Build Power Apps that work for every team

Smart Statistics can help you design, repair and govern business apps that capture reliable data—from the first tap through to Power BI reporting.