Библиотека AutoNumeric предназначена для форматирования числовых
значений в HTML-элементах: полях ввода, div,
span, таблицах и других контейнерах. При использовании
vanilla JavaScript работа строится напрямую через DOM API браузера без
промежуточных абстракций React, Vue или Angular.
Официальный сайт и документация: AutoNumeric
Наиболее распространённый способ подключения — через CDN.
<script src="https://cdn.jsdelivr.net/npm/autonumeric@4.10.5"></script>
После подключения глобальный объект AutoNumeric
становится доступным в браузере.
Минимальный пример:
<input id="price">
<script>
const priceInput = document.getElementById('price');
const anElement = new AutoNumeric(priceInput, {
currencySymbol: '₸ ',
decimalCharacter: ',',
digitGroupSeparator: ' '
});
</script>
После инициализации библиотека автоматически:
AutoNumeric умеет работать сразу с несколькими элементами.
<input class="money">
<input class="money">
<input class="money">
<script>
AutoNumeric.multiple('.money', {
currencySymbol: '$ ',
decimalPlaces: 2
});
</script>
Метод multiple() создаёт отдельный экземпляр для каждого
найденного элемента.
При работе с vanilla JavaScript важно учитывать момент доступности элементов.
Правильный подход:
document.addEventListener('DOMContentLoaded', () => {
const amount = document.querySelector('#amount');
new AutoNumeric(amount, {
decimalPlaces: 2
});
});
Без ожидания DOMContentLoaded скрипт может выполниться
раньше создания DOM-узлов.
Если в поле уже находится число, библиотека автоматически его форматирует.
<input id="salary" value="1500000">
<script>
new AutoNumeric('#salary', {
currencySymbol: '₽ ',
digitGroupSeparator: ' '
});
</script>
Результат:
₽ 1 500 000
const formatted = anElement.getFormatted();
console.log(formatted);
Пример результата:
₸ 12 500,00
const numeric = anElement.getNumber();
console.log(numeric);
Результат:
12500
const rawValue = anElement.getNumericString();
console.log(rawValue);
Результат:
12500.00
Такой формат особенно полезен при отправке данных на сервер.
anElement.set(50000);
Поле автоматически форматируется.
anElement.set('1234567.89');
anElement.set(null);
Поле очищается.
Иногда требуется получить значение без оформления.
const value = AutoNumeric.unformat('₸ 12 500,00', {
currencySymbol: '₸ ',
decimalCharacter: ',',
digitGroupSeparator: ' '
});
console.log(value);
Результат:
12500
Библиотека может использоваться как отдельный форматтер.
const result = AutoNumeric.format('1000000', {
currencySymbol: '$ ',
digitGroupSeparator: ','
});
console.log(result);
Результат:
$ 1,000,000
Настройки можно хранить прямо в HTML.
<input
id="tax"
data-currency-symbol="% "
data-decimal-places="2"
>
new AutoNumeric('#tax');
AutoNumeric автоматически читает data-* параметры.
const field = document.querySelector('#price');
field.addEventListener('autoNumeric:rawValueModified', (event) => {
console.log(event.detail.newRawValue);
});
Событие вызывается при изменении необработанного значения.
field.addEventListener('input', () => {
console.log(field.value);
});
field.addEventListener('autoNumeric:initialized', () => {
console.log('Инициализация завершена');
});
Наиболее правильный способ — отправлять числовое значение без форматирования.
<form id="payment-form">
<input id="amount">
<button type="submit">Send</button>
</form>
const autoNumeric = new AutoNumeric('#amount', {
currencySymbol: '$ '
});
document
.getElementById('payment-form')
.addEventListener('submit', (event) => {
event.preventDefault();
const rawValue = autoNumeric.getNumericString();
console.log(rawValue);
});
new AutoNumeric('#amount', {
unformatOnSubmit: true
});
Перед отправкой формы значение автоматически преобразуется в числовое.
В vanilla JavaScript элементы часто создаются через
createElement.
const input = document.createElement('input');
document.body.appendChild(input);
new AutoNumeric(input, {
currencySymbol: '€ '
});
Повторная инициализация одного и того же элемента вызывает ошибку.
Неправильно:
new AutoNumeric('#price');
new AutoNumeric('#price');
Правильно:
if (!AutoNumeric.isManagedByAutoNumeric('#price')) {
new AutoNumeric('#price');
}
anElement.remove();
После удаления поле перестаёт форматироваться.
Настройки можно менять динамически.
anElement.update({
currencySymbol: '€ ',
decimalPlaces: 3
});
AutoNumeric содержит готовые конфигурации локалей.
new AutoNumeric('#price', AutoNumeric.getPredefinedOptions().French);
new AutoNumeric('#amount', {
...AutoNumeric.getPredefinedOptions().NorthAmerican,
currencySymbol: '$ '
});
new AutoNumeric('#quantity', {
minimumValue: '0',
maximumValue: '100'
});
new AutoNumeric('#weight', {
decimalPlaces: 4
});
new AutoNumeric('#age', {
minimumValue: '0'
});
new AutoNumeric('#discount', {
suffixText: ' %',
decimalPlaces: 1
});
new AutoNumeric('#users', {
decimalPlaces: 0
});
По умолчанию колесо мыши может изменять значение.
Отключение:
new AutoNumeric('#amount', {
modifyValueOnWheel: false
});
new AutoNumeric('#counter', {
modifyValueOnUpDownArrow: true,
upDownStep: '10'
});
new AutoNumeric('#euro', {
digitGroupSeparator: '.',
decimalCharacter: ','
});
Результат:
1.234.567,89
new AutoNumeric('#usd', {
digitGroupSeparator: ',',
decimalCharacter: '.'
});
Результат:
1,234,567.89
AutoNumeric может форматировать не только input.
<div id="stat">5000000</div>
new AutoNumeric('#stat', {
currencySymbol: '$ '
});
<div id="editor" contenteditable="true"></div>
new AutoNumeric('#editor', {
decimalPlaces: 2
});
console.log(anElement.isPristine());
Метод показывает, изменялось ли значение после инициализации.
const domElement = anElement.node();
const price = new AutoNumeric('#price');
const tax = new AutoNumeric('#tax');
document.querySelector('#price').addEventListener('input', () => {
const value = price.getNumber();
tax.set(value * 0.12);
});
<table>
<tr>
<td><input class="money"></td>
</tr>
<tr>
<td><input class="money"></td>
</tr>
</table>
AutoNumeric.multiple('.money', {
currencySymbol: '$ '
});
const elements = AutoNumeric.multiple('.prices', {
currencySymbol: '$ '
});
elements.forEach(instance => {
instance.update({
decimalPlaces: 4
});
});
При динамическом интерфейсе можно автоматически инициализировать новые поля.
const observer = new MutationObserver((mutations) => {
mutations.forEach((mutation) => {
mutation.addedNodes.forEach((node) => {
if (node.matches && node.matches('.money')) {
new AutoNumeric(node, {
currencySymbol: '$ '
});
}
});
});
});
observer.observe(document.body, {
childList: true,
subtree: true
});
observer.disconnect();
anElement.remove();
В больших приложениях удобно хранить ссылки на экземпляры.
const autoNumericMap = new Map();
document.querySelectorAll('.money').forEach((element) => {
const instance = new AutoNumeric(element);
autoNumericMap.set(element.id, instance);
});
<input
class="currency"
data-symbol="₸ "
>
document.querySelectorAll('.currency').forEach((element) => {
new AutoNumeric(element, {
currencySymbol: element.dataset.symbol
});
});
При работе без фреймворков, но с bundler-системами:
import AutoNumeric from 'autonumeric';
const an = new AutoNumeric('#amount');
Установка:
npm install autonumeric
import AutoNumeric from 'autonumeric';
window.addEventListener('DOMContentLoaded', () => {
new AutoNumeric('#price', {
currencySymbol: '$ '
});
});
При подключении через <script defer> ожидание
DOMContentLoaded часто не требуется.
<script defer src="app.js"></script>
new AutoNumeric('#field');
new AutoNumeric('#field');
Вызывает конфликт экземпляров.
Неправильно:
input.value = '5000';
Правильно:
anElement.set(5000);
console.log(input.value);
Вернёт форматированную строку, а не число.
Для получения rawValue используется:
anElement.getNumericString();
При большом количестве элементов рекомендуется:
update();multiple() вместо ручных циклов;В крупных проектах часто используется отдельный модуль-инициализатор.
export function initMoneyFields() {
return AutoNumeric.multiple('.money', {
currencySymbol: '$ ',
decimalPlaces: 2
});
}
Использование:
import { initMoneyFields } from './money.js';
document.addEventListener('DOMContentLoaded', () => {
initMoneyFields();
});
Такой подход упрощает: