decimalCharacter

Параметр decimalCharacter в AutoNumeric определяет символ, используемый для разделения целой и дробной части числа при отображении и вводе. Это один из ключевых элементов локализации числового формата, поскольку разные регионы используют различные соглашения: точку, запятую или даже альтернативные символы.

AutoNumeric строго разделяет внутреннее числовое представление (JavaScript Number) и визуальное представление в поле ввода. decimalCharacter влияет исключительно на форматирование строки в input-элементе и на парсинг пользовательского ввода.


Назначение и роль в форматировании

Основная задача decimalCharacter заключается в том, чтобы задать символ, который:

  • отображает дробную часть числа;
  • интерпретируется при вводе пользователем;
  • используется при сериализации значения из DOM.

Примеры распространённых значений:

  • . — стандарт JavaScript и англоязычных локалей
  • , — распространён в Европе и России
  • '·' — используется в некоторых специализированных финансовых системах

Базовая конфигурация

При инициализации AutoNumeric параметр задаётся через объект конфигурации:

new AutoNumeric('#input', {
    decimalCharacter: '.'
});

Изменение на запятую:

new AutoNumeric('#input', {
    decimalCharacter: ','
});

При этом важно учитывать, что изменение decimalCharacter без синхронизации других параметров может привести к неоднозначному отображению, особенно при наличии разделителей групп разрядов.


Взаимодействие с digitGroupSeparator

decimalCharacter тесно связан с параметром digitGroupSeparator, который отвечает за разделение тысячных групп.

Комбинации:

{
    digitGroupSeparator: ' ',
    decimalCharacter: ','
}

Пример отображения:

12 345 678,90

Другой вариант:

{
    digitGroupSeparator: ',',
    decimalCharacter: '.'
}

Результат:

12,345,678.90

Критическое правило: decimalCharacter и digitGroupSeparator не должны совпадать, иначе парсер не сможет однозначно интерпретировать значение.


Поведение при вводе

AutoNumeric обрабатывает ввод посимвольно. При использовании decimalCharacter происходит следующее:

  1. Символ воспринимается как переключатель в режим дробной части.
  2. После ввода decimalCharacter дальнейшие цифры интерпретируются как дробные.
  3. Повторный ввод decimalCharacter игнорируется или корректируется (в зависимости от настроек поведения).

Пример:

Если задано:

decimalCharacter: ','

Ввод:

1234,56

Внутренне интерпретируется как:

1234.56

Парсинг и нормализация значения

AutoNumeric всегда хранит значение в нормализованном виде (JavaScript number с точкой как разделителем дробной части), независимо от decimalCharacter.

Пример:

const an = new AutoNumeric('#input', {
    decimalCharacter: ','
});

Пользователь вводит:

10,75

Внутри библиотеки это преобразуется в:

10.75

При получении значения:

an.getNumber();

результат всегда будет:

10.75

Особенности локализации

При смене локали decimalCharacter часто используется вместе с другими параметрами:

  • digitGroupSeparator
  • currencySymbol
  • decimalPlaces
  • outputFormat

Пример конфигурации для европейского формата:

new AutoNumeric('#input', {
    decimalCharacter: ',',
    digitGroupSeparator: '.',
    currencySymbol: '€ ',
    currencySymbolPlacement: 'p'
});

Отображение:

€ 1.234,56

Ограничения и конфликтные ситуации

1. Конфликт с вводом нескольких символов

Если пользователь пытается использовать альтернативный десятичный разделитель, он будет игнорироваться.

decimalCharacter: ','

Ввод:

12.34

Результат:

1234

(точка воспринимается как разделитель групп или игнорируется, в зависимости от режима)


2. Невалидные символы

Любой символ, не совпадающий с decimalCharacter, не может использоваться как разделитель дробной части.

Это означает, что при строгих настройках:

  • ввод 1,23 допустим только если decimalCharacter: ','
  • ввод 1.23 допустим только если decimalCharacter: '.'

3. Множественные decimalCharacter

Повторное использование символа дроби блокируется:

12,3,4

Превращается в:

12,34

или корректируется в зависимости от стратегии очистки ввода.


Изменение параметра после инициализации

AutoNumeric позволяет динамически менять форматирование:

an.update({
    decimalCharacter: '.'
});

После обновления:

  • текущее значение переформатируется;
  • ввод начинает интерпретироваться по новому символу;
  • внутреннее число остаётся неизменным.

Влияние на методы get/set

getString()

Возвращает строку с учётом decimalCharacter:

an.getString();

Пример:

"1.234,56"

getNumber()

Игнорирует decimalCharacter:

1234.56

set()

При установке значения можно использовать как точку, так и текущий decimalCharacter, но предпочтительна нормализованная форма:

an.set(1234.56);

или

an.set('1234.56');

Использование в формах и серверной синхронизации

При отправке данных на сервер decimalCharacter не должен участвовать в сериализации. AutoNumeric отделяет UI-формат от data-layer.

Правильный поток данных:

  • UI: 1.234,56
  • Model: 1234.56
  • Backend: JSON number

Edge-case сценарии

Ввод без дробной части

Если дробная часть отсутствует:

1234

decimalCharacter не влияет на отображение, но остаётся доступным для ввода дроби.


Автоматическое добавление дробного разделителя

При вводе:

1234,

AutoNumeric ожидает дальнейшие цифры и может отображать:

1234,

или:

1234,00

в зависимости от настроек фиксированной точности.


Работа с отрицательными числами

decimalCharacter не конфликтует с минусом:

-12,34

Парсится корректно при любом допустимом символе дроби.


Производственные сценарии использования

В реальных приложениях decimalCharacter критичен в следующих случаях:

  • финансовые интерфейсы с мульти-региональной поддержкой;
  • ERP-системы;
  • бухгалтерские формы;
  • интерфейсы банковских операций;
  • таблицы с редактируемыми числовыми ячейками.

Типичные ошибки конфигурации

  • совпадение decimalCharacter и digitGroupSeparator;
  • попытка использовать несколько символов одновременно;
  • несоответствие локали пользователя и конфигурации;
  • хранение UI-формата вместо числового значения в базе.

Поведение при пустом значении

Если поле пустое, decimalCharacter не отображается, но остаётся активным для ввода первого дробного символа.


Совместимость с другими режимами AutoNumeric

В режимах строгой валидации decimalCharacter становится единственным допустимым символом для дробной части, полностью блокируя альтернативные варианты ввода.

В упрощённых режимах возможна более мягкая интерпретация ввода, но нормализация всё равно приводит к единому внутреннему формату.