]> git.saurik.com Git - wxWidgets.git/commitdiff
Update cached values in wxNumberFormatter when locale changes.
authorVadim Zeitlin <vadim@wxwidgets.org>
Wed, 19 Jan 2011 10:48:10 +0000 (10:48 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Wed, 19 Jan 2011 10:48:10 +0000 (10:48 +0000)
Caching the decimal and thousands separators in wxNumberFormatter is a useful
performance optimization, however it can give wrong results if the locale
changed since the cached values were initialized. So remember the locale used
for the initialization and redo it if it changed. This should still be almost
as fast as the previous version but now also correct (still not MT-safe
though).

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@66713 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/common/numformatter.cpp

index ff658fb7373791536626a0a792fe7c6cb1021a30..39f4f5743e011c1b68684e47dc6eefe445e40c10 100644 (file)
@@ -36,7 +36,11 @@ wxChar wxNumberFormatter::GetDecimalSeparator()
     // concurrently from more than one thread so it's not a real problem.
     static wxChar s_decimalSeparator = 0;
 
-    if ( !s_decimalSeparator )
+    // Remember the locale which was current when we initialized, we must redo
+    // the initialization if the locale changed.
+    static wxLocale *s_localeUsedForInit = NULL;
+
+    if ( !s_decimalSeparator || (s_localeUsedForInit != wxGetLocale()) )
     {
         const wxString
             s = wxLocale::GetInfo(wxLOCALE_DECIMAL_POINT, wxLOCALE_CAT_NUMBER);
@@ -54,6 +58,8 @@ wxChar wxNumberFormatter::GetDecimalSeparator()
 
             s_decimalSeparator = s[0];
         }
+
+        s_localeUsedForInit = wxGetLocale();
     }
 
     return s_decimalSeparator;
@@ -63,8 +69,9 @@ bool wxNumberFormatter::GetThousandsSeparatorIfUsed(wxChar *sep)
 {
     static wxChar s_thousandsSeparator = 0;
     static bool s_initialized = false;
+    static wxLocale *s_localeUsedForInit = NULL;
 
-    if ( !s_initialized )
+    if ( !s_initialized || (s_localeUsedForInit != wxGetLocale()) )
     {
         const wxString
             s = wxLocale::GetInfo(wxLOCALE_THOUSANDS_SEP, wxLOCALE_CAT_NUMBER);
@@ -79,6 +86,7 @@ bool wxNumberFormatter::GetThousandsSeparatorIfUsed(wxChar *sep)
         //      be empty if grouping is not used, so just leave it as 0.
 
         s_initialized = true;
+        s_localeUsedForInit = wxGetLocale();
     }
 
     if ( !s_thousandsSeparator )