Преобразовать число в строку с указанной длиной в С++

У меня есть несколько чисел разной длины (например, 1, 999, 76492 и т.д.), и я хочу преобразовать их все в строки с общей длиной (например, если длина равна 6, то эти строки будут: '000001', '000999', '076492').

Другими словами, мне нужно добавить правильное количество ведущих нулей в число.

int n = 999;
string str = some_function(n,6);
//str = '000999'

Есть ли такая функция в С++?

Ответ 1

или используя строковые потоки:

#include <sstream>
#include <iomanip>

std::stringstream ss;
ss << std::setw(10) << std::setfill('0') << i;
std::string s = ss.str();

Я собрал информацию, которую я нашел на arachnoid.com, потому что мне больше нравится iostreams, безопасный для типов. Кроме того, вы можете использовать этот код в любом другом потоке.

Ответ 2

char str[7];
snprintf (buf, 7, "%06d", n);

См. snprintf

Ответ 3

Одна вещь, которую вы > хотите знать, - это потенциальная блокировка, которая может продолжаться, когда вы используете подход stringstream. В STL, который поставляется с Visual Studio 2008, по крайней мере, есть много блокировок, снятых и выпущенных, поскольку во время форматирования используется различная информация о локали. Это может или не может быть проблемой для вас в зависимости от того, сколько потоков у вас есть, которые могут одновременно конвертировать числа в строки...

В версии sprintf не требуются блокировки (по крайней мере, в соответствии с инструментом мониторинга блокировки, который я разрабатываю в данный момент...), и поэтому может быть "лучше" для использования в параллельных ситуациях.

Я заметил это только потому, что мой инструмент недавно выплюнул блокировки локали как один из наиболее распространенных для блокировок в моей серверной системе; это стало неожиданностью и может заставить меня пересмотреть подход, который я принимал (т.е. вернуться к sprintf от stringstream)...

Ответ 5

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

inline string some_function(int n, int len)
{
    string result(len--, '0');
    for (int val=(n<0)?-n:n; len>=0&&val!=0; --len,val/=10)
       result[len]='0'+val%10;
    if (len>=0&&n<0) result[0]='-';
    return result;
}

Ответ 6

Есть много способов сделать это. Самое простое:

int n = 999;
char buffer[256]; sprintf(buffer, "%06d", n);
string str(buffer);

Ответ 7

sprintf - это C-подобный способ выполнения этого действия, который также работает на С++.

В С++ будет выполняться комбинация форматирования потока строк и потока (см. http://www.arachnoid.com/cpptutor/student3.html).