handle negative time spans correctly in Format()

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@40205 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2006-07-20 15:04:10 +00:00
parent 1226b3b335
commit e566ccf1ba
3 changed files with 36 additions and 5 deletions

View File

@@ -86,6 +86,7 @@ All:
- Make wx-config compatible with Bourne shells. - Make wx-config compatible with Bourne shells.
- Fixed wxDb::Open(wxDbConnectInf) when using connection string (Hellwolf Misty) - Fixed wxDb::Open(wxDbConnectInf) when using connection string (Hellwolf Misty)
- Fixed crash in wxDb::Open() in Unicode build (Massimiliano Marretta) - Fixed crash in wxDb::Open() in Unicode build (Massimiliano Marretta)
- Fixed wxTimeSpan::Format() for negative time spans
All (GUI): All (GUI):

View File

@@ -4234,11 +4234,14 @@ wxString wxTimeSpan::Format(const wxChar *format) const
if ( ch == _T('%') ) if ( ch == _T('%') )
{ {
// the start of the format specification of the printf() below // the start of the format specification of the printf() below
wxString fmtPrefix = _T('%'); wxString fmtPrefix(_T('%'));
// the number // the number
long n; long n;
// the number of digits for the format string, 0 if unused
unsigned digits = 0;
ch = *++pch; // get the format spec char ch = *++pch; // get the format spec char
switch ( ch ) switch ( ch )
{ {
@@ -4273,6 +4276,13 @@ wxString wxTimeSpan::Format(const wxChar *format) const
n = GetHours(); n = GetHours();
if ( partBiggest < Part_Hour ) if ( partBiggest < Part_Hour )
{ {
if ( n < 0 )
{
// the sign has already been taken into account
// when outputting the biggest part
n = -n;
}
n %= HOURS_PER_DAY; n %= HOURS_PER_DAY;
} }
else else
@@ -4280,25 +4290,31 @@ wxString wxTimeSpan::Format(const wxChar *format) const
partBiggest = Part_Hour; partBiggest = Part_Hour;
} }
fmtPrefix += _T("02"); digits = 2;
break; break;
case _T('l'): case _T('l'):
n = GetMilliseconds().ToLong(); n = GetMilliseconds().ToLong();
if ( partBiggest < Part_MSec ) if ( partBiggest < Part_MSec )
{ {
if ( n < 0 )
n = -n;
n %= 1000; n %= 1000;
} }
//else: no need to reset partBiggest to Part_MSec, it is //else: no need to reset partBiggest to Part_MSec, it is
// the least significant one anyhow // the least significant one anyhow
fmtPrefix += _T("03"); digits = 3;
break; break;
case _T('M'): case _T('M'):
n = GetMinutes(); n = GetMinutes();
if ( partBiggest < Part_Min ) if ( partBiggest < Part_Min )
{ {
if ( n < 0 )
n = -n;
n %= MIN_PER_HOUR; n %= MIN_PER_HOUR;
} }
else else
@@ -4306,13 +4322,16 @@ wxString wxTimeSpan::Format(const wxChar *format) const
partBiggest = Part_Min; partBiggest = Part_Min;
} }
fmtPrefix += _T("02"); digits = 2;
break; break;
case _T('S'): case _T('S'):
n = GetSeconds().ToLong(); n = GetSeconds().ToLong();
if ( partBiggest < Part_Sec ) if ( partBiggest < Part_Sec )
{ {
if ( n < 0 )
n = -n;
n %= SEC_PER_MIN; n %= SEC_PER_MIN;
} }
else else
@@ -4320,10 +4339,19 @@ wxString wxTimeSpan::Format(const wxChar *format) const
partBiggest = Part_Sec; partBiggest = Part_Sec;
} }
fmtPrefix += _T("02"); digits = 2;
break; break;
} }
if ( digits )
{
// negative numbers need one extra position for '-' display
if ( n < 0 )
digits++;
fmtPrefix << _T("0") << digits;
}
str += wxString::Format(fmtPrefix + _T("ld"), n); str += wxString::Format(fmtPrefix + _T("ld"), n);
} }
else else

View File

@@ -689,6 +689,8 @@ void DateTimeTestCase::TestTimeSpanFormat()
{ 12, 34, 56, 789, _T("%H:%M:%S.%l"), _T("12:34:56.789") }, { 12, 34, 56, 789, _T("%H:%M:%S.%l"), _T("12:34:56.789") },
{ 1, 2, 3, 0, _T("%H:%M:%S"), _T("01:02:03") }, { 1, 2, 3, 0, _T("%H:%M:%S"), _T("01:02:03") },
{ 1, 2, 3, 0, _T("%S"), _T("3723") }, { 1, 2, 3, 0, _T("%S"), _T("3723") },
{ -1, -2, -3, 0, _T("%S"), _T("-3723") },
{ -1, -2, -3, 0, _T("%H:%M:%S"), _T("-01:02:03") },
}; };
for ( size_t n = 0; n < WXSIZEOF(testSpans); n++ ) for ( size_t n = 0; n < WXSIZEOF(testSpans); n++ )