Use C locale for numbers in wx(File)Config.

Using the current locale decimal point in config files results in problems
when moving the files to another machine or even using a different locale on
the same one, so don't do it.

Always write the numbers using C locale and try to read them in C locale too
first, but also try the current locale if we failed for backwards
compatibility and to be tolerant with users who edit their config files by
hand.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@64450 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2010-05-31 11:55:53 +00:00
parent 951201d81c
commit 7e22c2bd02
3 changed files with 21 additions and 2 deletions

View File

@ -450,6 +450,7 @@ All:
resources. resources.
- Added wxMessageQueue::Clear(). - Added wxMessageQueue::Clear().
- Added wxConfig::Read(float *) overload (Terry Farnham). - Added wxConfig::Read(float *) overload (Terry Farnham).
- Always use decimal point (and not the current locale separator) in wxConfig.
Unix: Unix:

View File

@ -689,6 +689,14 @@ public:
/** /**
Writes the double value to the config file and returns @true on Writes the double value to the config file and returns @true on
success. success.
Notice that if floating point numbers are saved as strings (as is the
case with the configuration files used by wxFileConfig), this function
uses the C locale for writing out the number, i.e. it will always use a
period as the decimal separator, irrespectively of the current locale.
This behaviour is new since wxWidgets 2.9.1 as the current locale was
used before, but the change should be transparent because both C and
current locales are tried when reading the numbers back.
*/ */
bool Write(const wxString& key, double value); bool Write(const wxString& key, double value);
/** /**

View File

@ -233,7 +233,14 @@ bool wxConfigBase::DoReadDouble(const wxString& key, double* val) const
wxString str; wxString str;
if ( Read(key, &str) ) if ( Read(key, &str) )
{ {
return str.ToDouble(val); if ( str.ToCDouble(val) )
return true;
// Previous versions of wxFileConfig wrote the numbers out using the
// current locale and not the C one as now, so attempt to parse the
// string as a number in the current locale too, for compatibility.
if ( str.ToDouble(val) )
return true;
} }
return false; return false;
@ -256,7 +263,10 @@ wxString wxConfigBase::ExpandEnvVars(const wxString& str) const
bool wxConfigBase::DoWriteDouble(const wxString& key, double val) bool wxConfigBase::DoWriteDouble(const wxString& key, double val)
{ {
return DoWriteString(key, wxString::Format(wxT("%g"), val)); // Notice that we always write out the numbers in C locale and not the
// current one. This makes the config files portable between machines using
// different locales.
return DoWriteString(key, wxString::FromCDouble(val));
} }
bool wxConfigBase::DoWriteBool(const wxString& key, bool value) bool wxConfigBase::DoWriteBool(const wxString& key, bool value)