diff --git a/conversion/stringbuilder.h b/conversion/stringbuilder.h index c620820..37955af 100644 --- a/conversion/stringbuilder.h +++ b/conversion/stringbuilder.h @@ -81,9 +81,10 @@ template (number % base)); - } + number /= base; + } while(number); } template >, std::is_integral, std::is_signed >...> @@ -94,9 +95,10 @@ void append(StringType &target, IntegralType number, typename StringType::value_ number = -number; } const auto start = target.begin() + target.size(); - for(; number; number /= base) { + do { target.insert(start, digitToChar(number % base)); - } + number /= base; + } while(number); } template diff --git a/conversion/stringconversion.h b/conversion/stringconversion.h index 5dc8299..37f1f7d 100644 --- a/conversion/stringconversion.h +++ b/conversion/stringconversion.h @@ -258,9 +258,10 @@ StringType numberToString(IntegralType number, typename StringType::value_type b for(auto n = number; n; n /= base, ++resSize); StringType res; res.reserve(resSize); - for(; number; number /= base) { + do { res.insert(res.begin(), digitToChar(number % base)); - } + number /= base; + } while(number); return res; } @@ -283,9 +284,10 @@ StringType numberToString(IntegralType number, typename StringType::value_type b for(auto n = number; n; n /= base, ++resSize); StringType res; res.reserve(resSize); - for(; number; number /= base) { + do { res.insert(res.begin(), digitToChar(number % base)); - } + number /= base; + } while(number); if(negative) { res.insert(res.begin(), '-'); } diff --git a/tests/conversiontests.cpp b/tests/conversiontests.cpp index 2bc1849..8929859 100644 --- a/tests/conversiontests.cpp +++ b/tests/conversiontests.cpp @@ -231,7 +231,9 @@ void ConversionTests::testStringEncodingConversions() */ void ConversionTests::testStringConversions() { - // stringToNumber() / numberToString() with random numbers + // stringToNumber() / numberToString() with zero and random numbers + CPPUNIT_ASSERT_EQUAL(string("0"), numberToString(0)); + CPPUNIT_ASSERT_EQUAL(string("0"), numberToString(0)); uniform_int_distribution randomDistSigned(numeric_limits::min()); uniform_int_distribution randomDistUnsigned(0); for(byte b = 1; b < 100; ++b) { @@ -310,6 +312,7 @@ void ConversionTests::testStringBuilder() const tuple tuple("string1", "string2", 1234, "string3"); CPPUNIT_ASSERT_EQUAL(string("string1string21234string3"), tupleToString(tuple)); CPPUNIT_ASSERT_EQUAL(string("foobarfoo2bar2"), tupleToString(string("foo") % "bar" % string("foo2") % "bar2")); + CPPUNIT_ASSERT_EQUAL(string("v2.3.0"), argsToString("v2.", 3, '.', 0)); // construction of string-tuple and final conversion to string works CPPUNIT_ASSERT_EQUAL_MESSAGE("result can be passed to any function taking a std::string"s, "123456789"s, functionTakingString("12" % string("34") % '5' % 67 + "89"));