Add wxNumberFormatter class helping to deal with thousands separators.
wxNumberFormatter formats and parses numbers with thousands separators. Add the class itself as well as documentation and the unit test for it. See #12166. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@66710 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
239
tests/strings/numformatter.cpp
Normal file
239
tests/strings/numformatter.cpp
Normal file
@@ -0,0 +1,239 @@
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Name: tests/strings/numformat.cpp
|
||||
// Purpose: wxNumberFormatter unit test
|
||||
// Author: Vadim Zeitlin
|
||||
// Created: 2011-01-15
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// headers
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
#include "testprec.h"
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#include "wx/numformatter.h"
|
||||
#include "wx/intl.h"
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// test class
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
class NumFormatterTestCase : public CppUnit::TestCase
|
||||
{
|
||||
public:
|
||||
NumFormatterTestCase()
|
||||
{
|
||||
// We need to use a locale with known decimal point and which uses the
|
||||
// thousands separator for the tests to make sense.
|
||||
wxLanguage lang;
|
||||
if ( wxLocale::IsAvailable(wxLANGUAGE_ENGLISH_US) )
|
||||
lang = wxLANGUAGE_ENGLISH_US;
|
||||
else if ( wxLocale::IsAvailable(wxLANGUAGE_ENGLISH_UK) )
|
||||
lang = wxLANGUAGE_ENGLISH_UK;
|
||||
else
|
||||
{
|
||||
m_locale = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
m_locale = new wxLocale(lang, wxLOCALE_DONT_LOAD_DEFAULT);
|
||||
}
|
||||
|
||||
virtual ~NumFormatterTestCase()
|
||||
{
|
||||
delete m_locale;
|
||||
}
|
||||
|
||||
private:
|
||||
CPPUNIT_TEST_SUITE( NumFormatterTestCase );
|
||||
CPPUNIT_TEST( LongToString );
|
||||
CPPUNIT_TEST( DoubleToString );
|
||||
CPPUNIT_TEST( NoTrailingZeroes );
|
||||
CPPUNIT_TEST( LongFromString );
|
||||
CPPUNIT_TEST( DoubleFromString );
|
||||
CPPUNIT_TEST_SUITE_END();
|
||||
|
||||
void LongToString();
|
||||
void DoubleToString();
|
||||
void NoTrailingZeroes();
|
||||
void LongFromString();
|
||||
void DoubleFromString();
|
||||
|
||||
wxLocale *m_locale;
|
||||
|
||||
wxDECLARE_NO_COPY_CLASS(NumFormatterTestCase);
|
||||
};
|
||||
|
||||
// register in the unnamed registry so that these tests are run by default
|
||||
CPPUNIT_TEST_SUITE_REGISTRATION( NumFormatterTestCase );
|
||||
|
||||
// also include in it's own registry so that these tests can be run alone
|
||||
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( NumFormatterTestCase, "NumFormatterTestCase" );
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// tests themselves
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void NumFormatterTestCase::LongToString()
|
||||
{
|
||||
if ( !m_locale )
|
||||
return;
|
||||
|
||||
CPPUNIT_ASSERT_EQUAL( "1", wxNumberFormatter::ToString( 1));
|
||||
CPPUNIT_ASSERT_EQUAL( "12", wxNumberFormatter::ToString( 12));
|
||||
CPPUNIT_ASSERT_EQUAL( "123", wxNumberFormatter::ToString( 123));
|
||||
CPPUNIT_ASSERT_EQUAL( "1,234", wxNumberFormatter::ToString( 1234));
|
||||
CPPUNIT_ASSERT_EQUAL( "12,345", wxNumberFormatter::ToString( 12345));
|
||||
CPPUNIT_ASSERT_EQUAL( "123,456", wxNumberFormatter::ToString( 123456));
|
||||
CPPUNIT_ASSERT_EQUAL( "1,234,567", wxNumberFormatter::ToString( 1234567));
|
||||
CPPUNIT_ASSERT_EQUAL( "12,345,678", wxNumberFormatter::ToString( 12345678));
|
||||
CPPUNIT_ASSERT_EQUAL("123,456,789", wxNumberFormatter::ToString( 123456789));
|
||||
}
|
||||
|
||||
void NumFormatterTestCase::DoubleToString()
|
||||
{
|
||||
if ( !m_locale )
|
||||
return;
|
||||
|
||||
CPPUNIT_ASSERT_EQUAL("1.0", wxNumberFormatter::ToString(1., 1));
|
||||
CPPUNIT_ASSERT_EQUAL("0.123456", wxNumberFormatter::ToString(0.123456, 6));
|
||||
CPPUNIT_ASSERT_EQUAL("1.234567", wxNumberFormatter::ToString(1.234567, 6));
|
||||
CPPUNIT_ASSERT_EQUAL("12.34567", wxNumberFormatter::ToString(12.34567, 5));
|
||||
CPPUNIT_ASSERT_EQUAL("123.4567", wxNumberFormatter::ToString(123.4567, 4));
|
||||
CPPUNIT_ASSERT_EQUAL("1,234.56", wxNumberFormatter::ToString(1234.56, 2));
|
||||
CPPUNIT_ASSERT_EQUAL("12,345.6", wxNumberFormatter::ToString(12345.6, 1));
|
||||
CPPUNIT_ASSERT_EQUAL("12,345.6", wxNumberFormatter::ToString(12345.6, 1));
|
||||
CPPUNIT_ASSERT_EQUAL("123,456,789.0",
|
||||
wxNumberFormatter::ToString(123456789., 1));
|
||||
CPPUNIT_ASSERT_EQUAL("123,456,789.012",
|
||||
wxNumberFormatter::ToString(123456789.012, 3));
|
||||
}
|
||||
|
||||
void NumFormatterTestCase::NoTrailingZeroes()
|
||||
{
|
||||
WX_ASSERT_FAILS_WITH_ASSERT
|
||||
(
|
||||
wxNumberFormatter::ToString(123L, wxNumberFormatter::Style_NoTrailingZeroes)
|
||||
);
|
||||
|
||||
if ( !m_locale )
|
||||
return;
|
||||
|
||||
CPPUNIT_ASSERT_EQUAL
|
||||
(
|
||||
"123.000",
|
||||
wxNumberFormatter::ToString(123., 3)
|
||||
);
|
||||
|
||||
CPPUNIT_ASSERT_EQUAL
|
||||
(
|
||||
"123",
|
||||
wxNumberFormatter::ToString(123., 3, wxNumberFormatter::Style_NoTrailingZeroes)
|
||||
);
|
||||
|
||||
CPPUNIT_ASSERT_EQUAL
|
||||
(
|
||||
"123",
|
||||
wxNumberFormatter::ToString(123., 9, wxNumberFormatter::Style_NoTrailingZeroes)
|
||||
);
|
||||
|
||||
CPPUNIT_ASSERT_EQUAL
|
||||
(
|
||||
"123.456",
|
||||
wxNumberFormatter::ToString(123.456, 3, wxNumberFormatter::Style_NoTrailingZeroes)
|
||||
);
|
||||
|
||||
CPPUNIT_ASSERT_EQUAL
|
||||
(
|
||||
"123.456000000",
|
||||
wxNumberFormatter::ToString(123.456, 9)
|
||||
);
|
||||
|
||||
CPPUNIT_ASSERT_EQUAL
|
||||
(
|
||||
"123.456",
|
||||
wxNumberFormatter::ToString(123.456, 9, wxNumberFormatter::Style_NoTrailingZeroes)
|
||||
);
|
||||
}
|
||||
|
||||
void NumFormatterTestCase::LongFromString()
|
||||
{
|
||||
if ( !m_locale )
|
||||
return;
|
||||
|
||||
WX_ASSERT_FAILS_WITH_ASSERT
|
||||
(
|
||||
wxNumberFormatter::FromString("123", static_cast<long *>(0))
|
||||
);
|
||||
|
||||
long l;
|
||||
CPPUNIT_ASSERT( !wxNumberFormatter::FromString("", &l) );
|
||||
CPPUNIT_ASSERT( !wxNumberFormatter::FromString("foo", &l) );
|
||||
CPPUNIT_ASSERT( !wxNumberFormatter::FromString("1.234", &l) );
|
||||
|
||||
CPPUNIT_ASSERT( wxNumberFormatter::FromString("123", &l) );
|
||||
CPPUNIT_ASSERT_EQUAL( 123, l );
|
||||
|
||||
CPPUNIT_ASSERT( wxNumberFormatter::FromString("1234", &l) );
|
||||
CPPUNIT_ASSERT_EQUAL( 1234, l );
|
||||
|
||||
CPPUNIT_ASSERT( wxNumberFormatter::FromString("1,234", &l) );
|
||||
CPPUNIT_ASSERT_EQUAL( 1234, l );
|
||||
|
||||
CPPUNIT_ASSERT( wxNumberFormatter::FromString("12,345", &l) );
|
||||
CPPUNIT_ASSERT_EQUAL( 12345, l );
|
||||
|
||||
CPPUNIT_ASSERT( wxNumberFormatter::FromString("123,456", &l) );
|
||||
CPPUNIT_ASSERT_EQUAL( 123456, l );
|
||||
|
||||
CPPUNIT_ASSERT( wxNumberFormatter::FromString("1,234,567", &l) );
|
||||
CPPUNIT_ASSERT_EQUAL( 1234567, l );
|
||||
}
|
||||
|
||||
void NumFormatterTestCase::DoubleFromString()
|
||||
{
|
||||
if ( !m_locale )
|
||||
return;
|
||||
|
||||
WX_ASSERT_FAILS_WITH_ASSERT
|
||||
(
|
||||
wxNumberFormatter::FromString("123", static_cast<double *>(0))
|
||||
);
|
||||
|
||||
double d;
|
||||
CPPUNIT_ASSERT( !wxNumberFormatter::FromString("", &d) );
|
||||
CPPUNIT_ASSERT( !wxNumberFormatter::FromString("bar", &d) );
|
||||
|
||||
CPPUNIT_ASSERT( wxNumberFormatter::FromString("123", &d) );
|
||||
CPPUNIT_ASSERT_EQUAL( 123., d );
|
||||
|
||||
CPPUNIT_ASSERT( wxNumberFormatter::FromString("123.456789012", &d) );
|
||||
CPPUNIT_ASSERT_EQUAL( 123.456789012, d );
|
||||
|
||||
CPPUNIT_ASSERT( wxNumberFormatter::FromString("1,234.56789012", &d) );
|
||||
CPPUNIT_ASSERT_EQUAL( 1234.56789012, d );
|
||||
|
||||
CPPUNIT_ASSERT( wxNumberFormatter::FromString("12,345.6789012", &d) );
|
||||
CPPUNIT_ASSERT_EQUAL( 12345.6789012, d );
|
||||
|
||||
CPPUNIT_ASSERT( wxNumberFormatter::FromString("123,456.789012", &d) );
|
||||
CPPUNIT_ASSERT_EQUAL( 123456.789012, d );
|
||||
|
||||
CPPUNIT_ASSERT( wxNumberFormatter::FromString("1,234,567.89012", &d) );
|
||||
CPPUNIT_ASSERT_EQUAL( 1234567.89012, d );
|
||||
|
||||
CPPUNIT_ASSERT( wxNumberFormatter::FromString("12,345,678.9012", &d) );
|
||||
CPPUNIT_ASSERT_EQUAL( 12345678.9012, d );
|
||||
|
||||
CPPUNIT_ASSERT( wxNumberFormatter::FromString("123,456,789.012", &d) );
|
||||
CPPUNIT_ASSERT_EQUAL( 123456789.012, d );
|
||||
|
||||
CPPUNIT_ASSERT( wxNumberFormatter::FromString("123456789.012", &d) );
|
||||
CPPUNIT_ASSERT_EQUAL( 123456789.012, d );
|
||||
}
|
Reference in New Issue
Block a user