Frage

Ich habe einige Zahlen unterschiedlicher Länge (wie 1, 999, 76492, usw.) und ich möchte sie alle Saiten mit einer gemeinsamen Länge konvertieren (zum Beispiel, wenn die Länge 6, dann werden diese Strings sein: '000001', '000999', '076492').

Mit anderen Worten, ich brauche richtige Menge von führenden Nullen auf die Zahl hinzuzufügen.

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

Gibt es eine Funktion wie diese in C ++?

War es hilfreich?

Lösung

oder mit dem stringstreams:

#include <sstream>
#include <iomanip>

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

ich die Informationen zusammengestellt Ich habe bei arachnoid.com , weil ich die Typ- mag sichere Art und Weise von iostreams mehr. Außerdem können Sie gleich diesen Code auf einem anderen Ausgabestrom verwendet werden.

Andere Tipps

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

Siehe snprintf

Eine Sache, die Sie können wollen sich bewusst sein, der die Potentialsperr ist, die auf gehen können, wenn Sie den stringstream Ansatz. In der STL, die mit Visual Studio 2008, zumindest gibt es viele Schlösser entnommen und als verschiedene locale Informationen freigegeben werden, während die Formatierung verwendet. Dies kann oder kann nicht sein, ein Problem für Sie je nachdem, wie viele Threads Sie haben, dass möglicherweise gleichzeitig Zahlen in Strings konvertiert werden ...

Die sprintf Version nimmt keine Sperren (zumindest nach dem Schloss-Monitoring-Tool, das ich im Moment bin entwickeln ...) und so sein könnte ‚besser‘ für den Einsatz in Situationen gleichzeitig.

Ich bemerkte nur, weil mein Werkzeug vor kurzem die ‚locale‘ Schlösser ausgespuckt wie unter den meisten stritten für Schlösser in meinem Server-System ist; es kam als etwas überraschend und verursachen kann mir den Ansatz zu revidieren, dass ich (das heißt bewegen zurück in Richtung sprintf von stringstream) habe dabei ...

string tun ( als xtofl wies darauf hin ). Boost-Format ist ein bequemer Ersatz für snprintf.

Dieses Verfahren verwendet keine Ströme noch sprintf. Anders als Sperr Probleme mit, ströme eine Performance-Overhead möglich und ist wirklich zuviel des Guten. Für Ströme kommt der Kopf aus der Notwendigkeit, den Dampf und Strom-Puffer zu konstruieren. Für sprintf, kommt der Kopf aus, um das Format-String zu interpretieren. Dies funktioniert auch, wenn n negativ ist oder wenn die Stringdarstellung von n ist länger als len . Dies ist die schnellste Lösung.

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

Es gibt viele Möglichkeiten, dies zu tun. Am einfachsten wäre:

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

sprintf ist die C-ähnliche Art und Weise, dies zu tun, die auch in C ++ funktioniert.

In C ++, eine Kombination aus einer string und Stream-Ausgabe-Formatierung (siehe http: // www .arachnoid.com / cpptutor / student3.html ) wird die Arbeit tun.

Dies ist ein alter Thread, aber wie fmt könnte es in den Standard machen, hier eine zusätzliche Lösung ist:

#include <fmt/format.h>

int n = 999;

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

Beachten Sie, dass die fmt::format("{:0>6}", n) gleich gut funktioniert, wenn die gewünschte Breite zum Zeitpunkt der Kompilierung bekannt ist. Eine weitere Option ist abseil :

#include <absl/strings/str_format.h>

int n = 999;

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

Auch hier abs::StrFormat("%06d", n) möglich. Boost-Format ist ein weiteres Tool für dieses Problem:

#include <boost/format.hpp>

int n = 999;

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

Leider variabler Breite Spezifizierer als Argumente mit dem Operator % verketteten nicht unterstützt werden, erfordert dies einen Format-String-Setup (z.B. const std::string fmt = "%0" + std::to_string(6) + "d";).

In Bezug auf Leistung, Abseilen und fmt Anspruch als sehr attraktiv und schneller als Schub. In jedem Fall werden alle drei Lösungen sollten effizienter sein als std::stringstream Ansätze und andere als die std::*printf Familie, sie nicht Art Sicherheit opfern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top