Преобразовать число в строку с указанной длиной в С++
У меня есть несколько чисел разной длины (например, 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
)...
Ответ 4
stringstream сделает (как указал xtofl). Формат ускорения является более удобной заменой для snprintf.
Ответ 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).