X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/66955cc2842c8372d369fdf66b2234084bfe8a94..2631773e8220c863a57beaa29eece92db31c1edf:/src/common/string.cpp diff --git a/src/common/string.cpp b/src/common/string.cpp index 54a7281a58..6cfea4102c 100644 --- a/src/common/string.cpp +++ b/src/common/string.cpp @@ -1349,22 +1349,43 @@ wxString wxString::Left(size_t nCount) const // get all characters before the first occurrence of ch // (returns the whole string if ch not found) -wxString wxString::BeforeFirst(wxUniChar ch) const +wxString wxString::BeforeFirst(wxUniChar ch, wxString *rest) const { int iPos = Find(ch); if ( iPos == wxNOT_FOUND ) - iPos = length(); + { + iPos = length(); + if ( rest ) + rest->clear(); + } + else + { + if ( rest ) + rest->assign(*this, iPos + 1, npos); + } + return wxString(*this, 0, iPos); } /// get all characters before the last occurrence of ch /// (returns empty string if ch not found) -wxString wxString::BeforeLast(wxUniChar ch) const +wxString wxString::BeforeLast(wxUniChar ch, wxString *rest) const { wxString str; int iPos = Find(ch, true); - if ( iPos != wxNOT_FOUND && iPos != 0 ) - str = wxString(c_str(), iPos); + if ( iPos != wxNOT_FOUND ) + { + if ( iPos != 0 ) + str.assign(*this, 0, iPos); + + if ( rest ) + rest->assign(*this, iPos + 1, npos); + } + else + { + if ( rest ) + *rest = *this; + } return str; } @@ -1818,17 +1839,43 @@ bool wxString::ToCDouble(double *pVal) const // ---------------------------------------------------------------------------- /* static */ -wxString wxString::FromCDouble(double val) +wxString wxString::FromDouble(double val, int precision) { + wxCHECK_MSG( precision >= -1, wxString(), "Invalid negative precision" ); + + wxString format; + if ( precision == -1 ) + { + format = "%g"; + } + else // Use fixed precision. + { + format.Printf("%%.%df", precision); + } + + return wxString::Format(format, val); +} + +/* static */ +wxString wxString::FromCDouble(double val, int precision) +{ + wxCHECK_MSG( precision >= -1, wxString(), "Invalid negative precision" ); + #if wxUSE_STD_IOSTREAM && wxUSE_STD_STRING // We assume that we can use the ostream and not wstream for numbers. wxSTD ostringstream os; + if ( precision != -1 ) + { + os.precision(precision); + os.setf(std::ios::fixed, std::ios::floatfield); + } + os << val; return os.str(); -#else // wxUSE_STD_IOSTREAM +#else // !wxUSE_STD_IOSTREAM // Can't use iostream locale support, fall back to the manual method // instead. - wxString s = FromDouble(val); + wxString s = FromDouble(val, precision); #if wxUSE_INTL wxString sep = wxLocale::GetInfo(wxLOCALE_DECIMAL_POINT, wxLOCALE_CAT_NUMBER);