2017-06-12 4 views
0

So normalerweise, wenn ich locale entsprechende Separatoren in einer bestimmten Anzahl, foo, ich würde so etwas tun einfügen wollte: http://coliru.stacked-crooked.com/a/054e927de25b5ad0Comma Separate Anzahl Ohne string

Leider wurde ich in meinem aktuellen Projekt gebeten, stringstreams nicht zu verwenden. Gibt es eine andere Möglichkeit, dies zu erreichen? Idealerweise ein locale abhängiger Weg?

+0

So haben Sie eine Nummer zu tausend getrennten Zeichenfolge oder eine Zeichenfolge zu einem Tausend getrennten Zeichenfolge konvertieren mögen oder brauchen Sie nur ausgeben, dass das so? – NathanOliver

+0

@NathanOliver Ja, und natürlich konnte ich sie manuell einfügen. Aber das wird nicht locale angemessen sein :( –

+0

Kannst du nicht [this] (https://stackoverflow.com/questions/17530408/print-integer-with-tausend-and-millions-separator) dann verwenden? Du brauchst eigentlich eine Schnur. – NathanOliver

Antwort

1

Also diese Antwort ist die C++ Destillation von Antwort Jerry Coffin auf diese Frage: Cross Platform Support for sprintf's Format '-Flag

template <typename T> 
enable_if_t<is_integral_v<remove_reference_t<T>>, string> poscommafmt(T N, const numpunct<char>& fmt_info) { 
    string result = to_string(N % 10); 
    const auto group = fmt_info.grouping(); 
    auto places = 0U; 

    for (auto posn = '\1'; 0 != (N /= 10); ++posn, result = to_string(N % 10) + result) { 
     if (group[places] == posn) { 
      if (places + 1U < size(group)) { 
       ++places; 
      } 
      posn = '\0'; 
      result = fmt_info.thousands_sep() + result; 
     } 
    } 
    return result; 
} 

template <typename T> 
enable_if_t<is_integral_v<remove_reference_t<T>>, string> commafmt(const T N, const numpunct<char>& fmt_info) { 
    return N < 0 ? '-' + poscommafmt(-N, fmt_info) : poscommafmt(N, fmt_info); 
} 

dies aus dem Kompliment Negation Problem leidet natürlich die gleich 2.

Dies profitiert sicherlich von C++ string Speicherverwaltung, sondern auch von der Fähigkeit, eine bestimmte numpunct<char> übergeben, die nicht das aktuelle Gebietsschema sein muss. Zum Beispiel, ob oder nicht cout.getloc() == locale("en-US") können Sie anrufen: commafmt(foo, use_facet<numpunct<char>>(locale("en-US")))

Live Example

0

Richten Sie ein Rohr ein. Verwenden Sie den Link zu Code construct an ofstream and ifstream from a file descriptor und dann zu einem ausgeben und lesen Sie den anderen.

Dies ist eine bizarre und verzerrte Lösung. Aber dann ist die Idee, dass Sie Locales verwenden müssen, Dinge zu speichern, und nicht stringstream verwenden kann, ist genauso bizarr. Also, sie geben dir bizarre Anforderungen, sie bekommen bizarren Code.

+1

Haha, ich kann garantieren, dass es nicht vorbei geht :) –

+1

@ JonathanMee - Dann können Sie sie nach einem besseren Weg fragen, um die Anforderungen zu erfüllen.:-) Manchmal ist dies der beste Weg, um dumme Entscheidungen zu erzwingen, um die Prüfung zu bekommen, die sie verdienen. Ich habe der Testabteilung gesagt, welche Testfälle ich einsetzen sollte, um Bugs auszulösen, von denen ich wusste, dass sie dort waren, aber der Entwickler würde dies nicht bestätigen. Manchmal ist es die Organisation und nicht der Code, den man hacken muss. – Omnifarious

+0

Das ist wahrscheinlich ein vernünftiger Vorschlag. Zu der Zeit, ein separates Programm zu schreiben, um das Problem zu lösen, wird als eine Lösung herumgeworfen Sie wissen, dass die Dinge ziemlich schlecht geworden sind. –