diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetSpinBoxes.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetSpinBoxes.cxx
index 4af61804517d82518ce13d78ec021a86b044fee5..9984222ae6a1fd7240dc544e2d9a811d15e245ce 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetSpinBoxes.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetSpinBoxes.cxx
@@ -103,7 +103,8 @@ void QtWidgetSpinBox::SetValueNoSignal(int value)
 int QtWidgetSpinBox::valueFromText(const QString &text) const
 {
   bool ok;
-  int result = QLocale::system().toInt(text, &ok);
+  // Force C locale because OTB gui is not i18n
+  int result = QLocale::c().toInt(text, &ok);
   if (ok)
   {
     return result;
@@ -162,7 +163,8 @@ void QtWidgetDoubleSpinBox::SetValueNoSignal(double value)
 double QtWidgetDoubleSpinBox::valueFromText(const QString &text) const
 {
   bool ok;
-  double result = QLocale::system().toDouble(text, &ok);
+  // Force C locale because OTB gui is not i18n
+  double result = QLocale::c().toDouble(text, &ok);
   if (ok)
   {
     return result;
@@ -180,7 +182,9 @@ QString QtWidgetDoubleSpinBox::textFromValue(double value) const
   // which leads to ugly trailing zeros for small values (e.g 1.50000)
   // We use std::ostringstream because QString::arg formatting support is too limited
   std::ostringstream oss;
-  oss.imbue(std::locale("")); // use system's locale for formatting
+
+  // Force C locale because OTB gui is not i18n
+  oss.imbue(std::locale::classic());
 
   // Set precision to the number of decimal digits that can be represented without change.
   // Use float precision because OTB parameter is float
@@ -190,9 +194,8 @@ QString QtWidgetDoubleSpinBox::textFromValue(double value) const
 
   // Add a trailing dot if the number is integer,
   // so that int and float parameters are more visually different.
-  // For now this is done for all locales, even though not all locales use this
-  // convention for formatting decimals...
-  const char dot = std::use_facet<std::numpunct<char>>(std::locale("")).decimal_point();
+  // This is an ok convention as long as we stay in C or english locale
+  const char dot = std::use_facet<std::numpunct<char>>(std::locale::classic()).decimal_point();
   if (oss.str().find(dot) == std::string::npos)
   {
       oss << dot;