Formatage de chaîne positionnel réel?
-
14-11-2019 - |
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?
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.