JavaScript аналог printf и String.Format: полный разбор

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

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));    //                

Блоги

Рекомендаций по книгам