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

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

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

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

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

56
0
8
Общее количество ответов: 8

Ответ #1

Ответ на вопрос: Преобразование числа в строку с указанной длиной в C++

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

#include 
#include 

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

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

79
3

  • В подобных ответах я всегда показываю результат. В этом случае, если `int i ...

Ответ #2

Ответ на вопрос: Преобразование числа в строку с указанной длиной в C++

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

См. snprintf

9X_basic-string

17
2

  • arg # 2 - это size_t, а не len, поэтому это 7, а не 6 ...

Ответ #3

Ответ на вопрос: Преобразование числа в строку с указанной длиной в C++

Одна вещь, о которой вы можете знать, - это потенциальная 9X_integers блокировка, которая может произойти при 9X_stlstring использовании подхода stringstream. В STL, который поставляется 9X_integers с Visual Studio 2008, по крайней мере, есть 9X_stlstring много снятых и выпущенных блокировок, поскольку 9X_cpp во время форматирования используется различная 9X_stdstring информация о локали. Это может быть, а может 9X_stdstring и не быть проблемой для вас, в зависимости 9X_basic-string от того, сколько потоков у вас может одновременно 9X_c++ преобразовывать числа в строки ...

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

Я заметил это только потому, что 9X_stlstring мой инструмент недавно заявил, что блокировки 9X_integer «локали» являются одними из наиболее часто 9X_integer используемых для блокировок в моей серверной 9X_cxx системе; это стало немного неожиданностью 9X_cpp и может заставить меня пересмотреть подход, который 9X_int я использовал (т. е. вернуться к sprintf из stringstream) ...

11
0

Ответ #4

Ответ на вопрос: Преобразование числа в строку с указанной длиной в C++

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

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

9X_basic-string

4
0

Ответ #5

Ответ на вопрос: Преобразование числа в строку с указанной длиной в C++

В этом методе не используются ни потоки, ни 9X_cpp sprintf. Помимо проблем с блокировкой, потоки 9X_stlstring несут накладные расходы на производительность 9X_stdstring и действительно являются излишними. Для 9X_cxx потоков накладные расходы возникают из-за 9X_integer необходимости создания буфера пара и потока. Для 9X_stlstring sprintf накладные расходы возникают из-за 9X_basic-string необходимости интерпретировать строку формата. Это 9X_c++ работает, даже когда n отрицательно или когда 9X_integer строковое представление n длиннее, чем len. Это 9X_basic-string САМОЕ БЫСТРОЕ решение.

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;
}

4
0

Ответ #6

Ответ на вопрос: Преобразование числа в строку с указанной длиной в C++

stringstream подойдет (as xtofl pointed out). Boost format - более удобная 9X_int замена snprintf.

3
0

Ответ #7

Ответ на вопрос: Преобразование числа в строку с указанной длиной в C++

Это старый поток, но поскольку fmt может стать 9X_integers стандартом, вот дополнительное решение:

#include 

int n = 999;

const auto str = fmt::format("{:0>{}}", n, 6);

Обратите 9X_c++ внимание, что fmt::format("{:0>6}", n) работает одинаково хорошо, когда 9X_integers желаемая ширина известна во время компиляции. Другой 9X_int вариант - abseil:

#include 

int n = 999;

const auto str = absl::StrFormat("%0*d", 6, n);

Опять же, abs::StrFormat("%06d", n) возможно. boost format - еще один 9X_cxx инструмент для решения этой проблемы:

#include 

int n = 999;

const auto str = boost::str(boost::format("%06d") % n);

К сожалению, спецификатор 9X_basic-string переменной ширины, поскольку аргументы, связанные 9X_stdstring с оператором %, не поддерживаются, для этого 9X_c++ требуется настройка строки формата (например, const std::string fmt = "%0" + std::to_string(6) + "d";).

С 9X_int точки зрения производительности abseil и 9X_cpp fmt утверждают, что они очень привлекательны 9X_cpp и быстрее, чем boost. В любом случае все 9X_int три решения должны быть более эффективными, чем 9X_integer подходы std::stringstream, и, кроме семейства std::*printf, они не жертвуют 9X_int безопасностью типов.

3
0

Ответ #8

Ответ на вопрос: Преобразование числа в строку с указанной длиной в C++

sprintf - это способ, подобный C, который 9X_stlstring также работает в C++.

В C++ комбинация строкового 9X_basic-string потока и форматирования вывода потока (см. http://www.arachnoid.com/cpptutor/student3.html) выполнит 9X_cxx свою работу.

1
0