Add wxNumberFormatter::Format() for floating point numbers

The existing ToString() is not flexible enough to be used in wxGrid,
which supports specifying the width (and not just the precision) as well
as using formats other than "%g" and "%f" which are the only ones
supported by the existing function.

Note that currently the implementation simply calls wxString::Format()
and then adjusts the decimal separator, but it could, in principle, use
wxUILocale methods for formatting the floating point numbers using
native platform functions for doing this, e.g. CFNumberFormatter under
macOS.
This commit is contained in:
Vadim Zeitlin
2021-08-14 13:59:17 +01:00
parent 85d379913d
commit 3fc031e75b
3 changed files with 34 additions and 0 deletions

View File

@@ -40,6 +40,13 @@ public:
int precision, int precision,
int style = Style_WithThousandsSep); int style = Style_WithThousandsSep);
// Format the given number using one of the floating point formats and
// ensure that the result uses the correct decimal separator.
// Prefer using ToString() if possible, i.e. if format is "%g" or "%.Nf"
// which are supported by it directly.
static wxString Format(const wxString& format, double val);
// Parse a string representing a number, possibly with thousands separator. // Parse a string representing a number, possibly with thousands separator.
// //
// Return true on success and stores the result in the provided location // Return true on success and stores the result in the provided location

View File

@@ -93,6 +93,16 @@ public:
static wxString static wxString
ToString(double val, int precision, int flags = Style_WithThousandsSep); ToString(double val, int precision, int flags = Style_WithThousandsSep);
/**
Format the given number using one of the floating point formats and
ensure that the result uses the correct decimal separator.
Prefer using ToString() if possible, i.e. if format is "%g" or "%.Nf"
which are supported by it directly.
@since 3.1.6
*/
static wxString Format(const wxString& format, double val);
/** /**
Parse a string representation of a number possibly including thousands Parse a string representation of a number possibly including thousands

View File

@@ -155,6 +155,23 @@ wxString wxNumberFormatter::ToString(double val, int precision, int style)
return s; return s;
} }
wxString wxNumberFormatter::Format(const wxString& format, double val)
{
wxString s = wxString::Format(format, val);
const wxChar sep = GetDecimalSeparator();
if ( s.find(sep) == wxString::npos )
{
const wxChar other = sep == '.' ? ',' : '.';
const size_t posSep = s.find(other);
if ( posSep != wxString::npos )
s[posSep] = sep;
}
//else: it already uses the correct separator
return s;
}
void wxNumberFormatter::AddThousandsSeparators(wxString& s) void wxNumberFormatter::AddThousandsSeparators(wxString& s)
{ {
// Thousands separators for numbers in scientific format are not relevant. // Thousands separators for numbers in scientific format are not relevant.