Как оформить отрицательные суммы в валюте в скобках по стандартам бухгалтерии?

Используйте опцию currencySign для отображения отрицательных валютных значений в бухгалтерском формате

Введение

В финансовых отчетах, бухгалтерских документах и балансах отрицательные суммы в валюте обычно показывают в скобках, а не со знаком минус. Например, убыток в пятьсот долларов будет выглядеть как ($500.00), а не как -$500.00. Такой подход делает отрицательные значения более заметными, снижает риск пропустить убытки и соответствует принятым стандартам бухгалтерии.

API Intl.NumberFormat в JavaScript предоставляет опцию currencySign для форматирования отрицательных сумм в этом бухгалтерском стиле. Если установить currencySign в значение "accounting", отрицательные значения будут автоматически отображаться в скобках в соответствии с локальными стандартами.

Почему в бухгалтерии используют скобки

Традиция заключать отрицательные суммы в скобки появилась ещё до появления компьютеров в бухгалтерии. Минус на бумаге мог быть маленьким, бледным или просто незаметным при просмотре столбцов чисел. Скобки создают чёткую визуальную границу вокруг отрицательных значений, делая их сразу заметными.

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

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

Использование формата accounting для currencySign

Передайте опцию currencySign со значением "accounting" при создании экземпляра Intl.NumberFormat для форматирования валюты. Это указывает форматтеру использовать бухгалтерское отображение для отрицательных сумм.

const formatter = new Intl.NumberFormat('en-US', {
  style: 'currency',
  currency: 'USD',
  currencySign: 'accounting'
});

console.log(formatter.format(-1234.56));
// Output: "($1,234.56)"

console.log(formatter.format(1234.56));
// Output: "$1,234.56"

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

Опция currencySign влияет только на форматирование валюты. Необходимо также задать style: 'currency' и указать код currency, чтобы опция сработала.

Сравнение стандартного и бухгалтерского форматов

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

const standard = new Intl.NumberFormat('en-US', {
  style: 'currency',
  currency: 'USD',
  currencySign: 'standard'
});

const accounting = new Intl.NumberFormat('en-US', {
  style: 'currency',
  currency: 'USD',
  currencySign: 'accounting'
});

console.log(standard.format(-500));
// Output: "-$500.00"

console.log(accounting.format(-500));
// Output: "($500.00)"

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

Если не указать опцию currencySign, форматтер по умолчанию использует поведение "standard".

const formatter = new Intl.NumberFormat('en-US', {
  style: 'currency',
  currency: 'USD'
});

console.log(formatter.format(-500));
// Output: "-$500.00"

Как бухгалтерское отображение зависит от локали

В разных локалях символ валюты и скобки располагаются по-разному, в зависимости от местных правил. API Intl.NumberFormat автоматически учитывает эти различия.

const currencies = [
  { locale: 'en-US', currency: 'USD' },
  { locale: 'de-DE', currency: 'EUR' },
  { locale: 'fr-FR', currency: 'EUR' },
  { locale: 'ja-JP', currency: 'JPY' }
];

currencies.forEach(({ locale, currency }) => {
  const formatter = new Intl.NumberFormat(locale, {
    style: 'currency',
    currency: currency,
    currencySign: 'accounting'
  });

  console.log(`${locale}: ${formatter.format(-1234.56)}`);
});

// Output:
// en-US: ($1,234.56)
// de-DE: (-1.234,56 €)
// fr-FR: (1 234,56 €)
// ja-JP: (¥-1,235)

Каждая локаль форматирует отрицательные суммы по своим правилам размещения символа валюты, разделителей и скобок. Не нужно знать эти правила или реализовывать их вручную — API применяет нужный формат по идентификатору локали.

В некоторых языках минус ставится внутри скобок рядом с числом, в других — рядом с символом валюты. Форматтер учитывает эти нюансы в зависимости от локальных правил.

Совмещение бухгалтерского формата с опциями отображения знаков

Опция currencySign работает вместе с signDisplay, чтобы управлять тем, как отображаются знаки в форматировании валюты. Такое сочетание даёт вам гибкий контроль над отображением положительных и отрицательных сумм.

/* CODE_PLACEHOLDER_658964e70a998997e21bea21c221d0fd */

С signDisplay: 'always' положительные суммы отображаются с плюсом, а отрицательные — по-прежнему в скобках. Так и прибыль, и убытки становятся явно видны.

/* CODE_PLACEHOLDER_5486637f958ff15fa078580b555082ab */

С signDisplay: 'never' и положительные, и отрицательные суммы показываются одинаково — без знаков и скобок. Видна только величина, независимо от знака.

/* CODE_PLACEHOLDER_2f53db38a679da2af3367f2a4766ac88 */

С signDisplay: 'exceptZero' положительные суммы идут с плюсом, отрицательные — в скобках, а ноль — без знака. Такой формат отлично подходит для отчётов о прибылях и убытках, где важно выделить изменения, а ноль оставить нейтральным.

Когда использовать бухгалтерский формат

Используйте бухгалтерский формат для отображения финансовых данных там, где пользователи ожидают видеть бухгалтерские стандарты. Это финансовые отчёты, балансы, отчёты о доходах и расходах, а также интерфейсы бухгалтерских программ.

Бухгалтерский формат делает отрицательные суммы более заметными, чем стандартный. Скобки создают визуальную границу, которая сразу выделяет убытки, долги или отрицательные балансы. Это помогает быстро находить проблемные места при просмотре финансовых данных.

/* CODE_PLACEHOLDER_5664c9a28448a09f5420c0cbdcef764a */

Скобки выделяют отрицательные балансы, помогая пользователям сразу замечать счета с минусовыми значениями.

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

const standardFormatter = new Intl.NumberFormat('en-US', {
  style: 'currency',
  currency: 'USD'
});

// For a shopping cart or refund:
console.log(standardFormatter.format(-25.50));
// Output: "-$25.50"

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

Поддержка бухгалтерского формата в браузерах

Опция currencySign: "accounting" поддерживается всеми современными браузерами. Chrome, Edge, Firefox, Safari и их мобильные версии поддерживают эту функцию в выпусках с 2019 года.

Если нужно поддерживать старые браузеры, протестируйте функцию и предусмотрите запасной вариант.

function formatCurrency(amount) {
  try {
    const formatter = new Intl.NumberFormat('en-US', {
      style: 'currency',
      currency: 'USD',
      currencySign: 'accounting'
    });
    return formatter.format(amount);
  } catch (error) {
    // Fallback for browsers without accounting support
    const formatter = new Intl.NumberFormat('en-US', {
      style: 'currency',
      currency: 'USD'
    });
    return formatter.format(amount);
  }
}

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