Преобразование числа в строку с указанной длиной в 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++?
Ответ #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 этот код в любом другом потоке вывода.
- В подобных ответах я всегда показываю результат. В этом случае, если `int i ...
Ответ #2
Ответ на вопрос: Преобразование числа в строку с указанной длиной в C++
char str[7]; snprintf (str, 7, "%06d", n);
См. snprintf
9X_basic-string
- 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
) ...
Ответ #4
Ответ на вопрос: Преобразование числа в строку с указанной длиной в C++
Есть много способов сделать это. Самый простой:
int n = 999;
char buffer[256]; sprintf(buffer, "%06d", n);
string str(buffer);
9X_basic-string
Ответ #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;
}
Ответ #6
Ответ на вопрос: Преобразование числа в строку с указанной длиной в C++
stringstream подойдет (as xtofl pointed out). Boost format - более удобная 9X_int замена snprintf.
Ответ #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 безопасностью типов.
Ответ #8
Ответ на вопрос: Преобразование числа в строку с указанной длиной в C++
sprintf - это способ, подобный C, который 9X_stlstring также работает в C++.
В C++ комбинация строкового 9X_basic-string потока и форматирования вывода потока (см. http://www.arachnoid.com/cpptutor/student3.html) выполнит 9X_cxx свою работу.
-
24
-
16
-
12
-
9
-
36
-
4
-
6
-
12
-
10
-
11
-
6
-
10
-
13
-
6
-
5
-
4
-
35
-
2
-
14
-
6
-
10
-
7
-
3
-
3
-
3
-
16
-
3
-
2
-
3
-
6
-
3
-
2
-
2
-
2
-
2
-
2
-
6
-
3
-
2
-
3
-
8
-
2
-
3
-
4
-
2
-
3
-
2
-
4
-
2
-
5