diff --git a/Common/GmshMessage.cpp b/Common/GmshMessage.cpp
index ad95614a4f7d5c5793d304c6a25738533c128986..0f979af9f9fd40b83fb32df51d30daff53dddc01 100644
--- a/Common/GmshMessage.cpp
+++ b/Common/GmshMessage.cpp
@@ -1391,6 +1391,8 @@ void Msg::ExchangeOnelabParameter(const std::string &key,
     ps[0].setAttribute("Closed", copt["Closed"][0]);
   if(noClosed && fopt.count("Closed"))
     ps[0].setAttribute("Closed", fopt["Closed"][0] ? "1" : "0");
+  if(copt.count("NumberFormat"))
+    ps[0].setAttribute("NumberFormat", copt["NumberFormat"][0]);
   _setStandardOptions(&ps[0], fopt, copt);
   _onelabClient->set(ps[0]);
 #endif
diff --git a/Fltk/inputRange.h b/Fltk/inputRange.h
index 67a2f93cdee1fa070b2a8cb0e6b79f7f4c81403e..4e1e7c2b9d0cd7f62e0a0c22edc127b2d6d24770 100644
--- a/Fltk/inputRange.h
+++ b/Fltk/inputRange.h
@@ -25,7 +25,7 @@ private:
   Fl_Toggle_Button *_loop_butt;
   Fl_Button *_range_butt, *_graph_butt;
   Fl_Menu_Button *_graph_menu;
-  std::string _loop_val, _graph_val;
+  std::string _loop_val, _graph_val, _number_format;
   double _min, _max, _step, _max_number;
   std::vector<double> _choices;
   std::string _range, _range_tooltip;
@@ -366,6 +366,7 @@ public:
   }
   int color() { return _input->color(); }
   Fl_Value_Input *input() { return _input; }
+  void numberFormat(const std::string &fmt) { _input->numberFormat(fmt); }
 };
 
 #endif
diff --git a/Fltk/inputValue.h b/Fltk/inputValue.h
index 4526258649b8c95064ece4842ac0e887cc521d56..664d8f7703bcea45e40276c9b2c41382d49ea165 100644
--- a/Fltk/inputValue.h
+++ b/Fltk/inputValue.h
@@ -8,16 +8,32 @@
 
 #include <FL/Fl.H>
 #include <FL/Fl_Value_Input.H>
+#include <string>
 
 // same as FL_Value_Input, but prints values in engineering notation
 
 class inputValue : public Fl_Value_Input {
+private:
+  std::string _number_format;
 public:
   inputValue(int x, int y, int w, int h, const char *l = 0)
     : Fl_Value_Input(x, y, w, h, l)
   {
   }
-  virtual int format(char *buffer) { return sprintf(buffer, "%g", value()); }
+  void numberFormat(const std::string &fmt) { _number_format = fmt; }
+  virtual int format(char *buffer)
+  {
+    if(_number_format.empty()) {
+      return sprintf(buffer, "%g", value());
+    }
+    else {
+      if(_number_format.find("d") != std::string::npos ||
+         _number_format.find("u") != std::string::npos)
+        return sprintf(buffer, _number_format.c_str(), (int)value());
+      else
+        return sprintf(buffer, _number_format.c_str(), value());
+    }
+  }
 };
 
 // same as inputValue, but forces the underlying FL_Value_Input to always accept
diff --git a/Fltk/onelabGroup.cpp b/Fltk/onelabGroup.cpp
index dee59eb3b11612b58b0d3117aaee86eba0bf228b..5b44eb619f1031698fe462ccce28fa00c1ecc51d 100644
--- a/Fltk/onelabGroup.cpp
+++ b/Fltk/onelabGroup.cpp
@@ -894,6 +894,7 @@ Fl_Widget *onelabGroup::_addParameterWidget(onelab::number &p, int ww, int hh,
   if(p.getReadOnly()) {
     outputRange *but = new outputRange(1, 1, ww, hh);
     but->callback(onelab_number_output_range_cb, (void *)path);
+    but->numberFormat(p.getAttribute("NumberFormat"));
     but->value(p.getValue());
     but->align(FL_ALIGN_RIGHT | FL_ALIGN_CLIP);
     but->graph(p.getAttribute("Graph"));
@@ -904,6 +905,7 @@ Fl_Widget *onelabGroup::_addParameterWidget(onelab::number &p, int ww, int hh,
   // general number input
   inputRange *but = new inputRange(1, 1, ww, hh, onelab::parameter::maxNumber(),
                                    p.getAttribute("ReadOnlyRange") == "1");
+  but->numberFormat(p.getAttribute("NumberFormat"));
   but->value(p.getValue());
   but->minimum(p.getMin());
   but->maximum(p.getMax());
diff --git a/Fltk/outputRange.h b/Fltk/outputRange.h
index 53820ebd192cb60fa2b74f4168669096c312a2f8..59eead4f0077bf3ea1b1466e7bb5f96aa61e1c37 100644
--- a/Fltk/outputRange.h
+++ b/Fltk/outputRange.h
@@ -20,7 +20,7 @@ private:
   Fl_Output *_output;
   Fl_Button *_graph_butt;
   Fl_Menu_Button *_graph_menu;
-  std::string _graph_val;
+  std::string _graph_val, _number_format;
   void _set_graph_value(const std::string &val, bool update_menu = true)
   {
     _graph_val = val;
@@ -140,9 +140,18 @@ public:
   }
   void value(double val)
   {
-    char tmp[128];
-    sprintf(tmp, "%g", val);
-    _output->value(tmp);
+    char buffer[256];
+    if(_number_format.empty()) {
+      sprintf(buffer, "%g", val);
+    }
+    else{
+      if(_number_format.find("d") != std::string::npos ||
+         _number_format.find("u") != std::string::npos)
+        sprintf(buffer, _number_format.c_str(), (int)val);
+      else
+        sprintf(buffer, _number_format.c_str(), val);
+    }
+    _output->value(buffer);
   }
   void graph(const std::string &val) { _set_graph_value(val); }
   std::string graph() { return _graph_val; }
@@ -151,6 +160,7 @@ public:
     _output->color(col);
     _output->textcolor(fl_contrast(FL_FOREGROUND_COLOR, col));
   }
+  void numberFormat(const std::string &fmt) { _number_format = fmt; }
 };
 
 #endif