Formater les nombres dans un gtkmm Gtk::Entry

a marqué ce sujet comme résolu.

Bonjour,

Je suis sur Ubuntu 21.04

J’apprends c++ et gtkmm 3.0

Actuellement dans un Gtk::Entry je cherche à formater les nombres de la façon suivante : 1 234 567 890,12

Avec arrondi à 2 décimales.

Je sais le faire dans un std::cout

Mais je n’arrive pas à trouver comment le faire dans une fenêtre.

Pour le moment mes recherches m’ont amener à tenter d’utiliser set_attributes , doc par là Gtk::Entry::set_attributes

ici aussi Pango::AttrList et même par là Language Identifiers (RFC 3066)

Mais je ne comprends pas comment me servir de set_attributeset ne sais si c’est la bonne solution.

J’ai fait ce petit programme pour tester tout ça

#include <gtkmm-3.0/gtkmm/application.h>
#include <gtkmm/main.h>
#include <iostream>
#include <gtkmm-3.0/gtkmm/window.h>
#include <gtkmm-3.0/gtkmm/box.h>
#include <gtkmm-3.0/gtkmm/label.h>
#include <gtkmm-3.0/gtkmm/entry.h>
#include <gtkmm-3.0/gtkmm/button.h>
#include <locale>
#include <iomanip>
#include <string>

std::string result(std::string const &entry);
void efface(Gtk::Entry &a, Gtk::Entry &b);
void stop(Gtk::Window &fenetre);

int main(int argc, char *argv [])
{
    auto app = Gtk::Application::create(argc, argv);
    Gtk::Window fenetre;

    Gtk::Button resultat{"Résultat"}, clear("Effacer"), quitter("Quitter");
    Gtk::Entry entry1, entry2;
    Gtk::VBox vbox1;
    Gtk::Label label1{"label1"}, label2{"label2"};

    fenetre.set_title("Test Pango");
    fenetre.set_default_size(300, 200);
    fenetre.set_border_width(10);
    fenetre.set_position(Gtk::WIN_POS_CENTER);

    entry1.grab_focus();

    vbox1.pack_start(label1);
    vbox1.pack_start(entry1);
    vbox1.pack_start(label2);
    vbox1.pack_start(entry2);
    vbox1.pack_start(resultat);
    vbox1.pack_start(clear);
    vbox1.pack_end(quitter);
    fenetre.add(vbox1);
    fenetre.show_all();

    resultat.signal_clicked().connect([&]()->void {entry2.set_text(result(entry1.get_text()));});
    // quitter.signal_clicked().connect([]() { Gtk::Main::quit(); }); Erreur de segmentation (core dumped) pourquoi ?
    clear.signal_clicked().connect([&]()-> void {efface(entry1, entry2);});
    quitter.signal_clicked().connect([&]()->void {stop(fenetre);});

    return app->run(fenetre);
}

std::string result(std::string const &entry)
{
    std::cout.imbue(std::locale("fr_FR.UTF-8"));
    std::cout << std::setiosflags(std::ios::fixed) << std::setprecision(2);
    std::cout << "entry2 = " << std::stod(entry) << std::endl;
    return entry;
}

void efface(Gtk::Entry &a, Gtk::Entry &b)
{
    a.set_text("");
    b.set_text("");
    a.grab_focus();
}
void stop(Gtk::Window &fenetre)
{
    fenetre.hide();
}

Une idée de comment procéder ? où me diriger vers une doc.

Tu ne pourrais pas écrire une string et ensuite tu attribues cette chaîne à l’entry ?

En utilisant un stringstream ?

+0 -0

Ben je ne vois pas pourquoi, si la lib standard le fait déjà, ça ferait double travail.

+0 -0

N’ayant rien trouvé de significatif, j’ai modifié ma fonction std::string result(std::string const &entry)

Pour ceux que ça peut intéresser voilà le code

std::string result(std::string const &entry)
{
  std::cout.imbue(std::locale("fr_FR.UTF-8"));
  std::cout << std::setiosflags(std::ios::fixed) << std::setprecision(2);
  std::cout << "entry2 = " << std::stod(entry) << std::endl;
  std::cout << "entry2 = " << std::size(entry) << std::endl;

  uint c{0}, m{0}, e{0}, f{0}, g{0};
  c = std::size(entry);
  m = c % 3;
  g = c / 3;
  char const espace{' '};
  std::string chaine{""};

  if (m == 0) { m = 3; }
  for (uint i = 0; i < m; ++i)
  {
    chaine += entry [i];
  }
  e = std::size(chaine);

  if (m == 3) { f = 3; }
  else { f = c - 3 * g; }
  
  for (uint i = e; i < c; ++i)
  {
    if (i == f)
    {
      chaine += espace;
      f += 3;
    }
    chaine += entry [i];
  }

  std::cout << "Chaine " << chaine << std::endl;
  return chaine;
}

Il reste à implémenter les nombres après la virgule

C’était trop évident à faire…

J’ai réécrit la fonction de cette façon

std::string stream(std::string const &entry)
{
  std::stringstream locale{};
  locale.imbue(std::locale("fr_FR.UTF-8"));
  locale << std::setiosflags(std::ios::fixed) << std::setprecision(2);
  locale << std::stod(entry);
  std::string traduction{locale.str()};
  std::cout << "Localisation en français = " << traduction << std::endl;
  return traduction;
}
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte