Как отформатировать отрицательные суммы в валюте с использованием скобок для бухгалтерского учета?
Используйте опцию currencySign, чтобы отображать отрицательные значения валюты в бухгалтерской нотации
Введение
Финансовые отчеты, бухгалтерские отчеты и балансовые ведомости отображают отрицательные суммы в валюте в круглых скобках, а не с использованием знака минус. Убыток в размере пятисот долларов отображается как ($500.00) вместо -$500.00. Этот стандарт делает отрицательные суммы более заметными, снижает риск пропуска убытков и соответствует установленным бухгалтерским стандартам.
API Intl.NumberFormat в JavaScript предоставляет опцию currencySign для форматирования отрицательных сумм в валюте в этом бухгалтерском формате. Если установить currencySign в значение "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));
// Вывод: "($1,234.56)"
console.log(formatter.format(1234.56));
// Вывод: "$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));
// Вывод: "-$500.00"
console.log(accounting.format(-500));
// Вывод: "($500.00)"
Стандартный формат размещает знак минус перед символом валюты. Бухгалтерский формат заключает всю сумму, включая символ валюты, в скобки. Оба формата выдают одинаковый результат для положительных значений.
Если вы не укажете опцию currencySign, форматирование по умолчанию будет соответствовать поведению "standard".
const formatter = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD'
});
console.log(formatter.format(-500));
// Вывод: "-$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)}`);
});
// Вывод:
// en-US: ($1,234.56)
// de-DE: (-1.234,56 €)
// fr-FR: (1 234,56 €)
// ja-JP: (¥-1,235)
Каждая локаль форматирует отрицательную сумму в соответствии с её конвенциями для размещения символа валюты, разделителей десятичных и тысячных разрядов, а также использования скобок. Вам не нужно знать эти конвенции или реализовывать их вручную. API применяет правильный формат на основе идентификатора локали.
Некоторые локали размещают знак минус внутри скобок рядом с числом. Другие размещают его рядом с символом валюты. Форматирование учитывает эти детали на основе правил, специфичных для локали.
Сочетание бухгалтерской нотации с опциями отображения знаков
currencySign используется вместе с опцией signDisplay для управления отображением знаков в форматировании валюты. Это сочетание позволяет точно настроить отображение положительных и отрицательных значений.
const always = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
currencySign: 'accounting',
signDisplay: 'always'
});
console.log(always.format(500));
// Вывод: "+$500.00"
console.log(always.format(-500));
// Вывод: "($500.00)"
С signDisplay: 'always' положительные значения отображаются с плюсом, а отрицательные — в скобках. Это делает явными как доходы, так и убытки.
const never = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
currencySign: 'accounting',
signDisplay: 'never'
});
console.log(never.format(500));
// Вывод: "$500.00"
console.log(never.format(-500));
// Вывод: "$500.00"
С signDisplay: 'never' положительные и отрицательные значения отображаются одинаково, без знаков или скобок. Это показывает только величину, независимо от того, положительное значение или отрицательное.
const exceptZero = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
currencySign: 'accounting',
signDisplay: 'exceptZero'
});
console.log(exceptZero.format(500));
// Вывод: "+$500.00"
console.log(exceptZero.format(-500));
// Вывод: "($500.00)"
console.log(exceptZero.format(0));
// Вывод: "$0.00"
С signDisplay: 'exceptZero' положительные значения отображаются с плюсом, отрицательные — в скобках, а ноль — без знака. Этот формат хорошо подходит для отчетов о прибылях и убытках, где важно выделить изменения, сохраняя нейтральность для нуля.
Когда использовать бухгалтерский формат
Используйте бухгалтерский формат при отображении финансовых данных в контексте, где пользователи ожидают соблюдения бухгалтерских стандартов. Это включает финансовую отчетность, балансовые отчеты, отчеты о доходах и убытках, а также интерфейсы бухгалтерского программного обеспечения.
Бухгалтерский формат делает отрицательные значения более заметными, чем стандартный формат. Скобки создают визуальную границу, которая привлекает внимание к убыткам, долгам или отрицательным балансам. Это помогает пользователям быстро выявлять проблемные области при просмотре финансовых данных.
const accountingFormatter = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
currencySign: 'accounting'
});
const accounts = [
{ name: 'Cash', balance: 15000 },
{ name: 'Accounts Receivable', balance: -3500 },
{ name: 'Inventory', balance: 12000 },
{ name: 'Accounts Payable', balance: -8000 }
];
accounts.forEach(account => {
const formatted = accountingFormatter.format(account.balance);
console.log(`${account.name}: ${formatted}`);
});
// Вывод:
// Cash: $15,000.00
// Accounts Receivable: ($3,500.00)
// Inventory: $12,000.00
// Accounts Payable: ($8,000.00)
Скобки выделяют отрицательные балансы, помогая пользователям быстро определить счета с отрицательными значениями.
Используйте стандартный формат для общего e-commerce, пользовательских интерфейсов или контекстов, где бухгалтерские стандарты не применяются. Большинство пользователей вне бухгалтерии и финансов менее знакомы с обозначением в скобках и ожидают видеть минус для отрицательных значений.
const standardFormatter = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD'
});
// Для корзины покупок или возврата:
console.log(standardFormatter.format(-25.50));
// Вывод: "-$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) {
// Альтернативный вариант для браузеров без поддержки бухгалтерского формата
const formatter = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD'
});
return formatter.format(amount);
}
}
Этот альтернативный вариант возвращает стандартный формат валюты, если формат бухгалтерского учета недоступен. На практике поддержка формата бухгалтерского учета достаточно распространена, поэтому этот альтернативный вариант редко требуется для приложений, поддерживающих только современные браузеры.