You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							259 lines
						
					
					
						
							12 KiB
						
					
					
				
			
		
		
	
	
							259 lines
						
					
					
						
							12 KiB
						
					
					
				| # React Currency Input Field Component
 | |
| 
 | |
| [](https://www.npmjs.com/package/react-currency-input-field) [](https://www.npmjs.com/package/react-currency-input-field) [](https://codecov.io/gh/cchanxzy/react-currency-input-field/) [](https://github.com/cchanxzy/react-currency-input-field/actions?query=workflow%3ARelease)
 | |
| 
 | |
| - [React Currency Input Field Component](#react-currency-input-field-component)
 | |
|   - [Features](#features)
 | |
|   - [Migrating to v3.0.0](#migrating-to-v300)
 | |
|   - [Examples](#examples)
 | |
|   - [Install](#install)
 | |
|   - [Usage](#usage)
 | |
|   - [Props](#props)
 | |
|     - [Abbreviations](#abbreviations)
 | |
|     - [Prefix and Suffix](#prefix-and-suffix)
 | |
|     - [Separators](#separators)
 | |
|     - [Intl Locale Config](#intl-locale-config)
 | |
|     - [Decimal Scale and Decimals Limit](#decimal-scale-and-decimals-limit)
 | |
|     - [Fixed Decimal Length](#fixed-decimal-length)
 | |
|   - [Format values for display](#format-values-for-display)
 | |
|   - [v3.0.0 Release Notes](#v300-release-notes)
 | |
|     - [Breaking Changes](#breaking-changes)
 | |
|     - [Improvements in v3](#improvements-in-v3)
 | |
|     - [Reasoning](#reasoning)
 | |
|   - [Issues](#issues)
 | |
| 
 | |
| ## Features
 | |
| 
 | |
| - Allows [abbreviations](#abbreviations) eg. 1k = 1,000 2.5m = 2,500,000
 | |
| - Prefix and Suffix options eg. £ or \$
 | |
| - Automatically inserts [group separator](#separators)
 | |
| - Accepts [Intl locale config](#intl-locale-config)
 | |
| - Can use arrow down/up to step
 | |
| - Can allow/disallow decimals
 | |
| - Written in TypeScript and has type support
 | |
| - Does not use any third party packages
 | |
| 
 | |
| ## Migrating to v3.0.0
 | |
| 
 | |
| There are a number of breaking changes in v3.0.0, please read the [release notes](#v300-release-notes) if migrating from v2 to v3.
 | |
| 
 | |
| :warning: Most important change is: `onChange` has been renamed to `onValueChange`
 | |
| 
 | |
| ## Examples
 | |
| 
 | |
| [Play with demo](https://cchanxzy.github.io/react-currency-input-field) or view [examples code](https://github.com/cchanxzy/react-currency-input-field/blob/master/src/examples)
 | |
| 
 | |
| [](https://cchanxzy.github.io/react-currency-input-field)
 | |
| 
 | |
| ## Install
 | |
| 
 | |
| `npm install react-currency-input-field`
 | |
| 
 | |
| or
 | |
| 
 | |
| `yarn add react-currency-input-field`
 | |
| 
 | |
| ## Usage
 | |
| 
 | |
| ```js
 | |
| import CurrencyInput from 'react-currency-input-field';
 | |
| 
 | |
| <CurrencyInput
 | |
|   id="input-example"
 | |
|   name="input-name"
 | |
|   placeholder="Please enter a number"
 | |
|   defaultValue={1000}
 | |
|   decimalsLimit={2}
 | |
|   onValueChange={(value, name) => console.log(value, name)}
 | |
| />;
 | |
| ```
 | |
| 
 | |
| Have a look in [`src/examples`](https://github.com/cchanxzy/react-currency-input-field/tree/master/src/examples) for more examples on implementing and validation.
 | |
| 
 | |
| ## Props
 | |
| 
 | |
| | Name                                               | Type       | Default        | Description                                                                                    |
 | |
| | -------------------------------------------------- | ---------- | -------------- | ---------------------------------------------------------------------------------------------- |
 | |
| | allowDecimals                                      | `boolean`  | `true`         | Allow decimals                                                                                 |
 | |
| | allowNegativeValue                                 | `boolean`  | `true`         | Allow user to enter negative value                                                             |
 | |
| | defaultValue                                       | `number`   |                | Default value                                                                                  |
 | |
| | value                                              | `number`   |                | Programmatically set the value                                                                 |
 | |
| | onValueChange                                      | `function` |                | Handle change in value                                                                         |
 | |
| | placeholder                                        | `string`   |                | Placeholder if no value                                                                        |
 | |
| | [decimalsLimit](#decimal-scale-and-decimals-limit) | `number`   | `2`            | Limit length of decimals allowed                                                               |
 | |
| | [decimalScale](#decimal-scale-and-decimals-limit)  | `number`   |                | Specify decimal scale for padding/trimming eg. 1.5 -> 1.50 or 1.234 -> 1.23 if decimal scale 2 |
 | |
| | [fixedDecimalLength](#fixed-decimal-length)        | `number`   |                | Value will always have the specified length of decimals                                        |
 | |
| | [prefix](#prefix-and-suffix)                       | `string`   |                | Include a prefix eg. £ or \$                                                                   |
 | |
| | [suffix](#prefix-and-suffix)                       | `string`   |                | Include a suffix eg. € or %                                                                    |
 | |
| | [decimalSeparator](#separators)                    | `string`   | locale default | Separator between integer part and fractional part of value                                    |
 | |
| | [groupSeparator](#separators)                      | `string`   | locale default | Separator between thousand, million and billion                                                |
 | |
| | [intlConfig](#intl-locale-config)                  | `object`   |                | International locale config                                                                    |
 | |
| | disabled                                           | `boolean`  | `false`        | Disabled                                                                                       |
 | |
| | disableAbbreviations                               | `boolean`  | `false`        | Disable abbreviations eg. 1k -> 1,000, 2m -> 2,000,000                                         |
 | |
| | [disableGroupSeparators](#separators)              | `boolean`  | `false`        | Disable auto adding the group separator between values, eg. 1000 -> 1,000                      |
 | |
| | maxLength                                          | `number`   |                | Maximum characters the user can enter                                                          |
 | |
| | step                                               | `number`   |                | Incremental value change on arrow down and arrow up key press                                  |
 | |
| | transformRawValue                                  | `function` |                | Transform the raw value from the input before parsing. Needs to return  `string`.              |
 | |
| 
 | |
| ### Abbreviations
 | |
| 
 | |
| It can parse values with abbreviations `k`, `m` and `b`
 | |
| 
 | |
| Examples:
 | |
| 
 | |
| - 1k = 1,000
 | |
| - 2.5m = 2,500,000
 | |
| - 3.456B = 3,456,000,000
 | |
| 
 | |
| This can be turned off by passing in `disableAbbreviations`.
 | |
| 
 | |
| ### Prefix and Suffix
 | |
| 
 | |
| You can add a prefix or suffix by passing in `prefix` or `suffix`.
 | |
| 
 | |
| ```js
 | |
| import CurrencyInput from 'react-currency-input-field';
 | |
| 
 | |
| <CurrencyInput prefix="£" value={123} />;
 | |
| // £123
 | |
| 
 | |
| <CurrencyInput suffix="%" value={456} />;
 | |
| // 456%
 | |
| ```
 | |
| 
 | |
| Note: Passing in prefix/suffix will override the intl locale config.
 | |
| 
 | |
| ### Separators
 | |
| 
 | |
| You can change the decimal and group separators by passing in `decimalSeparator` and `groupSeparator`.
 | |
| 
 | |
| Example:
 | |
| 
 | |
| ```js
 | |
| import CurrencyInput from 'react-currency-input-field';
 | |
| 
 | |
| <CurrencyInput decimalSeparator="," groupSeparator="." />;
 | |
| ```
 | |
| 
 | |
| Note: the separators cannot be a number, and `decimalSeparator` must be different to `groupSeparator`.
 | |
| 
 | |
| To turn off auto adding the group separator, add `disableGroupSeparators={true}`.
 | |
| 
 | |
| ### Intl Locale Config
 | |
| 
 | |
| This component can also accept international locale config to format the currency to locale setting.
 | |
| 
 | |
| Examples:
 | |
| 
 | |
| ```javascript
 | |
| import CurrencyInput from 'react-currency-input-field';
 | |
| 
 | |
| <CurrencyInput intlConfig={{ locale: 'en-US', currency: 'GBP' }} />;
 | |
| 
 | |
| <CurrencyInput intlConfig={{ locale: 'ja-JP', currency: 'JPY' }} />;
 | |
| 
 | |
| <CurrencyInput intlConfig={{ locale: 'en-IN', currency: 'INR' }} />;
 | |
| ```
 | |
| 
 | |
| `locale` should be a [BCP 47 language tag](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#Locale_identification_and_negotiation), such as "en-US" or "en-IN".
 | |
| 
 | |
| `currency` should be a [ISO 4217 currency code](https://en.wikipedia.org/wiki/ISO_4217), such as "USD" for the US dollar, "EUR" for the euro, or "CNY" for the Chinese RMB.
 | |
| 
 | |
| Any prefix, suffix, group separator and decimal separator options passed in will override the default locale settings.
 | |
| 
 | |
| ### Decimal Scale and Decimals Limit
 | |
| 
 | |
| `decimalsLimit` and `decimalScale` sound similar but have different usages.
 | |
| 
 | |
| `decimalsLimit` prevents the user from typing more than the limit, and `decimalScale` will format the decimals `onBlur` to the specified length, padding or trimming as necessary.
 | |
| 
 | |
| Example:
 | |
| 
 | |
| ```md
 | |
| If decimalScale is 2
 | |
| 
 | |
| - 1.5 becomes 1.50 (padded)
 | |
| - 1.234 becomes 1.23 (trimmed)
 | |
| 
 | |
| ---
 | |
| 
 | |
| If decimalLimit is 2
 | |
| 
 | |
| - User enters 1.23
 | |
| - User is then prevented from entering another value
 | |
| ```
 | |
| 
 | |
| ### Fixed Decimal Length
 | |
| 
 | |
| Use `fixedDecimalLength` so that the value will always have the specified length of decimals.
 | |
| 
 | |
| This formatting happens onBlur.
 | |
| 
 | |
| Example if `fixedDecimalLength` was 2:
 | |
| 
 | |
| ```md
 | |
| - 1 -> 1.00
 | |
| - 123 -> 1.23
 | |
| - 12.3 -> 12.30
 | |
| - 12.34 -> 12.34
 | |
| ```
 | |
| 
 | |
| ## Format values for display
 | |
| 
 | |
| Use the `formatValue` function to format the values to a more user friendly string. This is useful if you are displaying the value somewhere else ie. the total of multiple inputs.
 | |
| 
 | |
| ```javascript
 | |
| import { formatValue } from 'react-currency-input-field';
 | |
| 
 | |
| // Format using prefix, groupSeparator and decimalSeparator
 | |
| const formattedValue1 = formatValue({
 | |
|   value: '123456',
 | |
|   groupSeparator: ',',
 | |
|   decimalSeparator: '.',
 | |
|   prefix: '$',
 | |
| });
 | |
| 
 | |
| console.log(formattedValue1);
 | |
| // $123,456
 | |
| 
 | |
| // Format using intl locale config
 | |
| const formattedValue2 = formatValue({
 | |
|   value: '500000',
 | |
|   intlConfig: { locale: 'en-IN', currency: 'INR' },
 | |
| });
 | |
| 
 | |
| console.log(formattedValue2);
 | |
| // ₹5,00,000
 | |
| ```
 | |
| 
 | |
| ## v3.0.0 Release Notes
 | |
| 
 | |
| ### Breaking Changes
 | |
| 
 | |
| - :warning: `onChange` renamed to `onValueChange` :warning:
 | |
| - `onBlurValue` has been removed.
 | |
| - `turnOffAbbreviations` renamed to `disableAbbreviations`.
 | |
| - `turnOffSeparators` renamed to `disableGroupSeparators`.
 | |
| - `precision` renamed to `decimalScale`
 | |
| 
 | |
| ### Improvements in v3
 | |
| 
 | |
| - [Intl locale config](#intl-locale-config) can be passed in. _Please note: formatting where the currency symbol is placed after the value like a suffix eg. (1 234,56 €) might cause problems, this is still in development._
 | |
| - Group separator will default to browser locale if not specified.
 | |
| - Can pass `ref` to the component.
 | |
| - `onChange` and `onBlur` functions can be passed in and will be called with original event.
 | |
| 
 | |
| ### Reasoning
 | |
| 
 | |
| As this component grew in usage, I started getting more bug reports and feature requests. That wasn't a problem though, because I was always happy to fix any bugs and implement any features if I could.
 | |
| 
 | |
| However, this meant sometimes I was a bit trigger happy, and didn't always think about how the different options interacted with each other. I found that it was getting a bit convoluted for my liking, and choices I had made earlier in development, now seemed like it could be improved.
 | |
| 
 | |
| Therefore, I took the opportunity of v3 to do a bit of tidying up for the component, in order to make it more future proof and intuitive to use.
 | |
| 
 | |
| I apologize if any of the changes cause new bugs or issues. Please let me know and I will fix asap.
 | |
| 
 | |
| ## Issues
 | |
| 
 | |
| Feel free to raise an issue on Github if you find a bug or have a feature request
 |