diff --git a/include/wx/generic/spinctlg.h b/include/wx/generic/spinctlg.h index c3d2e9eef5..ff3c8ca2ed 100644 --- a/include/wx/generic/spinctlg.h +++ b/include/wx/generic/spinctlg.h @@ -380,6 +380,7 @@ public: double inc = 1, const wxString& name = wxT("wxSpinCtrlDouble")) { + DetermineDigits(inc); return wxSpinCtrlGenericBase::Create(parent, id, value, pos, size, style, min, max, initial, inc, name); @@ -410,6 +411,7 @@ protected: virtual bool DoTextToValue(const wxString& text, double *val) wxOVERRIDE; virtual wxString DoValueToText(double val) wxOVERRIDE; + void DetermineDigits(double inc); unsigned m_digits; diff --git a/src/generic/spinctlg.cpp b/src/generic/spinctlg.cpp index 0620948741..29443b6f3d 100644 --- a/src/generic/spinctlg.cpp +++ b/src/generic/spinctlg.cpp @@ -673,6 +673,8 @@ wxString wxSpinCtrl::DoValueToText(double val) // wxSpinCtrlDouble //----------------------------------------------------------------------------- +#define SPINCTRLDBL_MAX_DIGITS 20 + wxIMPLEMENT_DYNAMIC_CLASS(wxSpinCtrlDouble, wxSpinCtrlGenericBase); void wxSpinCtrlDouble::DoSendEvent() @@ -696,7 +698,7 @@ wxString wxSpinCtrlDouble::DoValueToText(double val) void wxSpinCtrlDouble::SetDigits(unsigned digits) { - wxCHECK_RET( digits <= 20, "too many digits for wxSpinCtrlDouble" ); + wxCHECK_RET( digits <= SPINCTRLDBL_MAX_DIGITS, "too many digits for wxSpinCtrlDouble" ); if ( digits == m_digits ) return; @@ -708,6 +710,16 @@ void wxSpinCtrlDouble::SetDigits(unsigned digits) DoSetValue(m_value, SendEvent_None); } +void wxSpinCtrlDouble::DetermineDigits(double inc) +{ + inc = fabs(inc); + if ( inc > 0.0 && inc < 1.0 ) + { + m_digits = wxMin(SPINCTRLDBL_MAX_DIGITS, -static_cast(floor(log10(inc)))); + m_format.Printf("%%0.%ulf", m_digits); + } +} + #endif // wxUSE_SPINBTN #endif // !wxPort-with-native-spinctrl