Question

(Remarque: je connais Boost.format, je cherche une meilleure façon de procéder ce qui suit.)
D'abord un exemple de cas d'utilisation: dans certains pays, vous nommez une personne en appelant son nom de famille en premier et le premier nom, tandis que dans d'autres pays, c'est exactement le contraire.

Maintenant, pour mon code, je résolve actuellement cela avec boost.format de la manière suivante:

#include <boost/format.hpp>
#include <iostream>
#include <stdlib.h>
#include <utility>

int main(){
    using namespace boost;

    int pos1 = 2, pos2 = 1;
    char const* surname = "Surname", *forename = "Forename";

    // decision on ordering here
    bool some_condition = false;

    if(some_condition)
      std::swap(pos1,pos2);

    char buf[64];
    sprintf(buf,"Hello %c%d%c %c%d%c",'%',pos1,'%','%',pos2,'%');
    // buf == "Hello %[pos1]% %[pos2]%"; with [posN] = value of posN

    std::cout << format(buf) % surname % forename;
}

Maintenant, je préfère l'avoir comme ça, c'est-à-dire tout dans le format ligne:

std::cout << format("Hello %%1%% %%2%%") % pos1 % pos2 % surname % forename;

Mais malheureusement, cela ne fonctionne pas, car j'obtiens une belle exception d'analyse.

Y a-t-il une bibliothèque pour avoir un réel formatage de position? Ou même un moyen d'y parvenir avec Boost.format que je ne connais pas?

Était-ce utile?

La solution

À mon avis, Augmenter.Esprit.Karma est la bibliothèque de formatage de sortie moderne définitive.

Autres conseils

C'est le Formatage des messages partie de Boost.locale qui est similaire à GNU GetText.

Vous y écririez:

cout << format(translate("Hello {1} {2}!")) % forename % surname << endl;

Et puis un traducteur traduireait la chaîne à l'aide de catalogues de messages:

msgid "Hello {1} {2}!"
msgstr "こんにちは {2}-さん!"

J'échangerais simplement les valeurs que vous interpolez

std::swap(surname, forename)

Cela fera le travail. Si vous ne voulez pas jouer avec eux, ayez des références:

const std::string& param1(bSwapThem? forename : surname);
const std::string& param2(bSwapThem? surname  : forename);

EMBRASSER

Cela ressemble à quelque chose qui devrait être dans les paramètres régionaux du système, mais il ne semble pas qu'il soit actuellement pris en charge.

Qu'en est-il de la manière simple?

   if(some_condition)
      std::cout << surname << " " << forename;
   else
      std::cout << forename << " " << surname;

J'aurais utilisé?:

char const* surname = "Surname", *forename = "Forename";
bool swapFlag = (some_condition) ? true : false;

std::cout << "Hello " << (swapFlag ? surname : forename) << " " << (!swapFlag ? surname : forename) << std::endl;

Vous pouvez le faire en appliquant un format récursivement:

cout << format(str(format("%%%1%%% %%%2%%%") % pos1 % pos2)) % surname % forname;

Cependant, je recommanderais d'utiliser quelque chose comme GNU GetText Au lieu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top