Description
The InputMasked component uses the basic Input component, but with some additional masking functionality.
How it works
This component uses the basic Input but with a set of options and features.
You will either create your own mask, or use one of the provided once. There are also masks which change based on different locales (as_currency
or as_number
).
Accessibility
Screen readers will read also the mask before the user is entering the content. Also, the user will hear the mask during typing. This behavior can both have positive and negative side effects on the user. But overall, it works ok.
Both entering a comma or a dot will act as a decimal separator if decimals are enabled and one of the internal masks for numbers is used.
InputMode
For mobile devices and soft keyboards, the HTML input element does support a numeric-only keyboard. But sadly it does not support negative values at the time of writing this. So it is only enabled if allowNegative
is set to false.
<InputMasked mask_options={{ allowNegative: false }} />
Mask based on locale
The InputMasked component supports masks based on a given locale. The locale will be inherited from the Eufemia Provider if not given.
As of now, you can enable these masks by giving:
as_currency="EUR"
as_number={true}
You can still send in custom mask parameters to currency_mask={{ ... }}
or number_mask={{ ... }}
. But you can also make use of mask_options={{ ... }}
and just send in your extra options in there.
More details in the examples above.
Clean number values
If you use as_currency
or as_number
you have to always send inn in a clean number without any mask (value="1234.50"
):
<InputMasked as_currency="EUR" value="1234.50" />
You can also receive a clean number value you can use and send back in again:
<InputMaskedas_currency="EUR"value="1234.50"on_change={({ numberValue }) => {console.log(numberValue) // type of float}}/>
Decimals
number_mask
will default to no decimalscurrency_mask
will default to no decimalsas_number
will default to no decimalsas_currency
will default to 2 decimals
You can change the number of decimals by sending in options to the currency_mask
, number_mask
, or mask_options
(see example above).
This example here also shows how to affect every InputMasked component in your application, by setting these options on the Eufemia Provider.
<Providerlocale="en-GB"InputMasked={{currency_mask: {decimalLimit: 3, // defaults to 2},number_mask: {decimalLimit: 6, // defaults to no decimals},}}><InputMasked as_currency="USD" value="1234.567" /></Provider>
To remove a decimal limit, you can send in null
and allow decimals with allowDecimal
:
<InputMaskedas_numbermask_options={{allowDecimal: true,decimalLimit: null,}}value="1234.567"/>
Demos
Locale based numbers
When you use as_number
or as_percent
(and as_currency
see below) it will create a mask for you and inherit the locale from the Eufemia Provider, if the locale prop is not given.
You can still define extra mask parameters with number_mask
or mask_options
, as the second input example shows (e.g. decimalLimit
).
<FormRow vertical><InputMaskedlabel="Number:"as_numbermask_options={{ allowNegative: false }}value="1234.50"rightbottomon_change={({ numberValue }) => {console.log(numberValue)}}/><InputMaskedlabel="Number (decimal limit):"as_numbernumber_mask={{ decimalLimit: 2 }}value="1234.016"rightbottomon_change={({ numberValue }) => {console.log(numberValue)}}/><InputMaskedlabel="Percentage:"as_percentnumber_mask={{ decimalLimit: 1 }}value="1234.016"rightbottomon_change={({ numberValue }) => {console.log(numberValue)}}/></FormRow>
as_currency
Locale based When you use as_currency
it will create a mask for you and inherit the locale from the Eufemia Provider, if the locale prop is not given.
<FormRow vertical><InputMaskedlabel="Currency:"as_currency="EUR"value="1234.50"on_change={({ numberValue }) => {console.log(numberValue)}}rightbottom/><Providerlocale="en-GB"InputMasked={{currency_mask: {decimalLimit: 3,},}}><InputMaskedlabel="Currency:"as_currency="USD"value="1234.567"on_change={({ numberValue }) => {console.log(numberValue)}}rightbottom/></Provider></FormRow>
currency_mask
manually
Define the <FormRow vertical><InputMaskedlabel="Left aligned (default):"show_maskcurrency_mask="kr"on_change={({ numberValue }) => {console.log(numberValue)}}rightbottom/><InputMaskedlabel="Right aligned:"show_maskcurrency_mask={{ currency: 'NOK' }}align="right"on_change={({ numberValue }) => {console.log(numberValue)}}/></FormRow>
Customize the number mask
<InputMaskedlabel="Masked amount:"show_masknumber_mask={{suffix: ' kr',allowDecimal: true,}}placeholder_char={null}on_change={({ numberValue }) => {console.log(numberValue)}}/>
number_mask
with a combined suffix
Using the <InputMaskedlabel="Masked input:"value="1000000"number_mask={{suffix: ',-',allowDecimal: false,}}suffix="kr"on_change={({ numberValue }) => {console.log(parseInt(numberValue || 0, 10))}}/>
number_mask
and a prefix
Using the <InputMaskedlabel="Masked input:"number_mask={{prefix: 'NOK ',}}stretch={true}placeholder="Enter a number"on_change={({ numberValue }) => {console.log(numberValue)}}/>
Phone Number, starting with 4
<InputMaskedlabel="Masked input:"mask={['0','0',/[4]/, // have to start with 4/[5-7]/, // can be 5,6 or 7' ',/[49]/, // have to start with 4 or 9/\d/,' ',/\d/,/\d/,' ',/\d/,/\d/,' ',/\d/,/\d/,]}show_maskplaceholder_char="_"keep_char_positionson_change={({ numberValue }) => {console.log(numberValue)}}/>