Ваш Javascript будет выполняться на клиенте, а не на сервере. Это означает, что foo
не оценивается на стороне сервера, и поэтому его значение не может быть записано в файл на сервере.
Лучший способ подумать об этом процессе - это как будто вы генерируя текстовый файл динамически. Текст, который вы генерируете, становится исполняемым кодом после того, как браузер интерпретирует его. Только то, что вы размещаете между тегами <?php
, оценивается на сервере.
Кстати, создание привычки встраивать случайные фрагменты PHP-логики в HTML или Javascript может привести к серьезному запутанному коду. Я говорю от болезненного опыта.
или используя stringstreams:
#include <sstream>
#include <iomanip>
std::stringstream ss;
ss << std::setw(10) << std::setfill('0') << i;
std::string s = ss.str();
Я скомпилировал информацию, найденную мной на arachnoid.com , потому что мне нравится безопасный тип iostreams. Кроме того, вы можете одинаково использовать этот код для любого другого выходного потока.
sprintf - это C-подобный способ выполнения этого действия, который также работает на C ++.
В C ++ комбинация форматирования выходного потока и потока (см. http: // www. arachnoid.com/cpptutor/student3.html) выполнит эту работу.
stringstream будет делать (, как указал xtofl ). Формат ускорения - более удобная замена для snprintf.
Одна вещь, о которой вы, возможно, захотите знать, - это потенциальная блокировка, которая может продолжаться, когда вы используете подход stringstream
. В STL, который поставляется с Visual Studio 2008, по крайней мере, есть много блокировок, снятых и выпущенных, поскольку во время форматирования используется различная информация о локали. Это может или не может быть проблемой для вас в зависимости от того, сколько потоков у вас есть, которые могут одновременно конвертировать числа в строки ...
Версия sprintf
не требует блокировок (на по крайней мере, в соответствии с инструментом мониторинга блокировки, который я сейчас разрабатываю ...), и поэтому может быть «лучше» для использования в параллельных ситуациях.
Я заметил это только потому, что мой инструмент недавно выплюнул «локальные» блокировки являются одними из самых популярных для блокировок в моей серверной системе; это стало неожиданностью и может заставить меня пересмотреть подход, который я принимал (т. е. вернуться к sprintf
из stringstream
) ...
Это старый поток, но поскольку fmt может превратить его в стандарт, вот дополнительное решение:
#include <fmt/format.h>
int n = 999;
const auto str = fmt::format("{:0>{}}", n, 6);
Обратите внимание, что fmt::format("{:0>6}", n)
работает одинаково хорошо, когда желаемая ширина известна во время компиляции. Другой вариант - abseil :
#include <absl/strings/str_format.h>
int n = 999;
const auto str = absl::StrFormat("%0*d", 6, n);
Опять же, abs::StrFormat("%06d", n)
возможно. boost format - еще один инструмент для этой проблемы:
#include <boost/format.hpp>
int n = 999;
const auto str = boost::str(boost::format("%06d") % n);
К сожалению, спецификатор переменной ширины в качестве аргументов, связанных с оператором %
, не поддерживается, для этого требуется установка строки формата ( например const std::string fmt = "%0" + std::to_string(6) + "d";
).
С точки зрения производительности, abseil и fmt утверждают, что они очень привлекательны и быстрее, чем boost. В любом случае все три решения должны быть более эффективными, чем подходы std::stringstream
, и кроме семейства std::*printf
, они не жертвуют безопасностью типа.
char str[7];
snprintf (str, 7, "%06d", n);
См. snprintf
Есть много способов сделать это. Простейшим было бы:
int n = 999;
char buffer[256]; sprintf(buffer, "%06d", n);
string str(buffer);
Этот метод не использует потоки или 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;
}
sstream
иiomanip
. – Gareth 20 March 2014 в 22:21stringstream
,setw
иsetfill
(а такжеstring
) находятся в пространстве именstd
. – rafalcieslak 9 January 2015 в 14:32int i=1;
, это0000000001
. – nakulchawla09 30 April 2018 в 00:17