JavaScript аналог printf и String.Format: как форматировать строки как профи?
Вы когда-нибудь писали такой код на JavaScript?
let name = 'Алексей';
let age = 28;
console.log('Привет, меня зовут ' + name + ' и мне ' + age + ' лет.');
Если да — вы точно знаете, как это раздражает. Постоянно открывать и закрывать кавычки, ставить плюсы, путаться в пробелах. А если нужно вставить 5-6 переменных? Кошмар!
В других языках эту проблему решили давно. В Python есть f"Привет, {name}" и "%s %d" % (name, age). В C — легендарный printf. В C# и Java — String.Format. А что же в JavaScript?
Спойлер: решение есть, и не одно. В этой статье мы разберем все способы форматирования строк в JavaScript — от классических до современных. Вы узнаете, какой аналог printf в JavaScript выбрать для вашей задачи, и навсегда забудете про конкатенацию.
Почему вопрос "JavaScript equivalent to printf/String.Format" так популярен?
На Stack Overflow этот вопрос собрал сотни тысяч просмотров. И это не случайно. Каждый разработчик, переходящий с другого языка на JavaScript, первым делом ищет привычный инструмент форматирования строк.
Проблема в том, что в чистом JavaScript нет встроенного аналога printf или String.Format. Есть только конкатенация (склеивание строк через +). Но разработчики нашли несколько элегантных решений, и мы их разберем.
Способ 1: Шаблонные строки (Template Literals) — современный стандарт
Начиная с ES6 (2015 год), в JavaScript появились шаблонные строки. Это лучший аналог printf и String.Format для повседневного использования. Они работают во всех современных браузерах и Node.js.
Синтаксис: используем обратные кавычки ` вместо обычных, а переменные вставляем через ${}.
let name = 'Мария';
let age = 25;
let city = 'Москва';
// Вместо конкатенации
let message = `Привет, меня зовут ${name}, мне ${age} лет, я из ${city}.`;
console.log(message);
// Вывод: Привет, меня зовут Мария, мне 25 лет, я из Москва.
Но это ещё не всё! Внутри ${} можно выполнять любые выражения JavaScript:
let a = 10;
let b = 5;
console.log(`Сумма: ${a + b}`); // Сумма: 15
console.log(`Больше? ${a > b ? 'да' : 'нет'}`); // Больше? да
console.log(`Случайное: ${Math.random()}`); // Случайное: 0.4837...
Почему это лучший аналог printf в JavaScript?
- Читаемость — код выглядит как обычный текст с вставками
- Безопасность — экранирование происходит автоматически
- Многострочность — можно писать текст в несколько строк
- Выражения — можно вставлять результаты вычислений
Многострочные шаблонные строки
let html = `
<div class="card">
<h2>${title}</h2>
<p>${description}</p>
</div>
`;
console.log(html);
// Вывод — аккуратный HTML с сохранением переносов
Сравните с конкатенацией — разница колоссальная!
Способ 2: Библиотека sprintf-js — классический printf в JavaScript
Если вы ностальгируете по printf из C или %-форматированию из Python, у вас есть отличный вариант — библиотека sprintf-js.
Установка через npm:
npm install sprintf-js
Использование:
const sprintf = require('sprintf-js').sprintf;
const vsprintf = require('sprintf-js').vsprintf;
// Простое форматирование
let result = sprintf('Привет, %s! Тебе %d года.', 'Иван', 30);
console.log(result); // Привет, Иван! Тебе 30 года.
// Форматирование чисел
console.log(sprintf('Цена: $%.2f', 123.456)); // Цена: $123.46
// Выравнивание
console.log(sprintf('%-10s %10s', 'Имя', 'Возраст'));
console.log(sprintf('%-10s %10d', 'Анна', 25));
console.log(sprintf('%-10s %10d', 'Максим', 32));
// Вывод:
// Имя Возраст
// Анна 25
// Максим 32
Спецификаторы форматирования:
%s— строка%d— целое число%f— число с плавающей точкой%x— шестнадцатеричное число%o— восьмеричное число
Это полный аналог printf в JavaScript для тех, кто привык к такому синтаксису.
Способ 3: Собственная функция — String.format своими руками
Если не хотите подключать библиотеки, а ${} кажется недостаточно гибким, напишите свою функцию аналога String.Format из C#.
// Простейший вариант
function format(template, ...args) {
return template.replace(/{(\d+)}/g, function(match, index) {
return typeof args[index] !== 'undefined' ? args[index] : match;
});
}
// Использование
let message = format('Привет, {0}! Тебе {1} лет.', 'Ольга', 27);
console.log(message); // Привет, Ольга! Тебе 27 лет.
// С именованными параметрами
function formatNamed(template, params) {
return template.replace(/{(\w+)}/g, function(match, key) {
return params.hasOwnProperty(key) ? params[key] : match;
});
}
let result = formatNamed('Меня зовут {name}, мне {age} лет.', {
name: 'Дмитрий',
age: 35
});
console.log(result); // Меня зовут Дмитрий, мне 35 лет.
Можно пойти дальше и добавить форматирование чисел и дат:
function advancedFormat(template, ...args) {
return template.replace(/{(\d+)(?::(\w+))?}/g, function(match, index, formatType) {
let value = args[index];
if (value === undefined) return match;
switch(formatType) {
case 'currency':
return '$' + Number(value).toFixed(2);
case 'int':
return Math.floor(Number(value));
case 'percent':
return (Number(value) * 100).toFixed(1) + '%';
default:
return value;
}
});
}
console.log(advancedFormat('Цена: {0:currency}', 49.99)); //