resolved fdo#70319 exponent must be followed by at least one digit
Change-Id: Icdd22fa0f1efcdd18cfea7cb48e1cbf2cf8d3533
This commit is contained in:
@@ -72,9 +72,21 @@ public:
|
|||||||
CPPUNIT_ASSERT_EQUAL(0.0, res);
|
CPPUNIT_ASSERT_EQUAL(0.0, res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test_stringToDouble_exponent_without_digit() {
|
||||||
|
rtl_math_ConversionStatus status;
|
||||||
|
sal_Int32 end;
|
||||||
|
double res = rtl::math::stringToDouble(
|
||||||
|
rtl::OUString("1e"),
|
||||||
|
sal_Unicode('.'), sal_Unicode(','), &status, &end);
|
||||||
|
CPPUNIT_ASSERT_EQUAL(rtl_math_ConversionStatus_Ok, status);
|
||||||
|
CPPUNIT_ASSERT_EQUAL(sal_Int32(RTL_CONSTASCII_LENGTH("1")), end);
|
||||||
|
CPPUNIT_ASSERT_EQUAL(1.0, res);
|
||||||
|
}
|
||||||
|
|
||||||
CPPUNIT_TEST_SUITE(Test);
|
CPPUNIT_TEST_SUITE(Test);
|
||||||
CPPUNIT_TEST(test_stringToDouble_good);
|
CPPUNIT_TEST(test_stringToDouble_good);
|
||||||
CPPUNIT_TEST(test_stringToDouble_bad);
|
CPPUNIT_TEST(test_stringToDouble_bad);
|
||||||
|
CPPUNIT_TEST(test_stringToDouble_exponent_without_digit);
|
||||||
CPPUNIT_TEST_SUITE_END();
|
CPPUNIT_TEST_SUITE_END();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -799,6 +799,7 @@ inline double stringToDouble(CharT const * pBegin, CharT const * pEnd,
|
|||||||
// Exponent
|
// Exponent
|
||||||
if (p != p0 && p != pEnd && (*p == CharT('E') || *p == CharT('e')))
|
if (p != p0 && p != pEnd && (*p == CharT('E') || *p == CharT('e')))
|
||||||
{
|
{
|
||||||
|
CharT const * const pExponent = p;
|
||||||
++p;
|
++p;
|
||||||
bool bExpSign;
|
bool bExpSign;
|
||||||
if (p != pEnd && *p == CharT('-'))
|
if (p != pEnd && *p == CharT('-'))
|
||||||
@@ -812,6 +813,7 @@ inline double stringToDouble(CharT const * pBegin, CharT const * pEnd,
|
|||||||
if (p != pEnd && *p == CharT('+'))
|
if (p != pEnd && *p == CharT('+'))
|
||||||
++p;
|
++p;
|
||||||
}
|
}
|
||||||
|
CharT const * const pFirstExpDigit = p;
|
||||||
if ( fVal == 0.0 )
|
if ( fVal == 0.0 )
|
||||||
{ // no matter what follows, zero stays zero, but carry on the
|
{ // no matter what follows, zero stays zero, but carry on the
|
||||||
// offset
|
// offset
|
||||||
@@ -857,6 +859,10 @@ inline double stringToDouble(CharT const * pBegin, CharT const * pEnd,
|
|||||||
else
|
else
|
||||||
fVal = rtl::math::pow10Exp( fVal, nExp ); // normal
|
fVal = rtl::math::pow10Exp( fVal, nExp ); // normal
|
||||||
}
|
}
|
||||||
|
else if (p == pFirstExpDigit)
|
||||||
|
{ // no digits in exponent, reset end of scan
|
||||||
|
p = pExponent;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (p - p0 == 2 && p != pEnd && p[0] == CharT('#')
|
else if (p - p0 == 2 && p != pEnd && p[0] == CharT('#')
|
||||||
|
Reference in New Issue
Block a user