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:
parent
1226b3b335
commit
e566ccf1ba
@ -86,6 +86,7 @@ All:
|
||||
- Make wx-config compatible with Bourne shells.
|
||||
- Fixed wxDb::Open(wxDbConnectInf) when using connection string (Hellwolf Misty)
|
||||
- Fixed crash in wxDb::Open() in Unicode build (Massimiliano Marretta)
|
||||
- Fixed wxTimeSpan::Format() for negative time spans
|
||||
|
||||
All (GUI):
|
||||
|
||||
|
@ -4234,11 +4234,14 @@ wxString wxTimeSpan::Format(const wxChar *format) const
|
||||
if ( ch == _T('%') )
|
||||
{
|
||||
// the start of the format specification of the printf() below
|
||||
wxString fmtPrefix = _T('%');
|
||||
wxString fmtPrefix(_T('%'));
|
||||
|
||||
// the number
|
||||
long n;
|
||||
|
||||
// the number of digits for the format string, 0 if unused
|
||||
unsigned digits = 0;
|
||||
|
||||
ch = *++pch; // get the format spec char
|
||||
switch ( ch )
|
||||
{
|
||||
@ -4273,6 +4276,13 @@ wxString wxTimeSpan::Format(const wxChar *format) const
|
||||
n = GetHours();
|
||||
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;
|
||||
}
|
||||
else
|
||||
@ -4280,25 +4290,31 @@ wxString wxTimeSpan::Format(const wxChar *format) const
|
||||
partBiggest = Part_Hour;
|
||||
}
|
||||
|
||||
fmtPrefix += _T("02");
|
||||
digits = 2;
|
||||
break;
|
||||
|
||||
case _T('l'):
|
||||
n = GetMilliseconds().ToLong();
|
||||
if ( partBiggest < Part_MSec )
|
||||
{
|
||||
if ( n < 0 )
|
||||
n = -n;
|
||||
|
||||
n %= 1000;
|
||||
}
|
||||
//else: no need to reset partBiggest to Part_MSec, it is
|
||||
// the least significant one anyhow
|
||||
|
||||
fmtPrefix += _T("03");
|
||||
digits = 3;
|
||||
break;
|
||||
|
||||
case _T('M'):
|
||||
n = GetMinutes();
|
||||
if ( partBiggest < Part_Min )
|
||||
{
|
||||
if ( n < 0 )
|
||||
n = -n;
|
||||
|
||||
n %= MIN_PER_HOUR;
|
||||
}
|
||||
else
|
||||
@ -4306,13 +4322,16 @@ wxString wxTimeSpan::Format(const wxChar *format) const
|
||||
partBiggest = Part_Min;
|
||||
}
|
||||
|
||||
fmtPrefix += _T("02");
|
||||
digits = 2;
|
||||
break;
|
||||
|
||||
case _T('S'):
|
||||
n = GetSeconds().ToLong();
|
||||
if ( partBiggest < Part_Sec )
|
||||
{
|
||||
if ( n < 0 )
|
||||
n = -n;
|
||||
|
||||
n %= SEC_PER_MIN;
|
||||
}
|
||||
else
|
||||
@ -4320,10 +4339,19 @@ wxString wxTimeSpan::Format(const wxChar *format) const
|
||||
partBiggest = Part_Sec;
|
||||
}
|
||||
|
||||
fmtPrefix += _T("02");
|
||||
digits = 2;
|
||||
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);
|
||||
}
|
||||
else
|
||||
|
@ -689,6 +689,8 @@ void DateTimeTestCase::TestTimeSpanFormat()
|
||||
{ 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("%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++ )
|
||||
|
Loading…
Reference in New Issue
Block a user