Skip to content

Commit ed54e86

Browse files
authored
Merge pull request #4797 from nyashbox/feat/add_g_specifier_to_format
Make Poco::format() support %g or %G as a format specifier like printf() does
2 parents 02c86d4 + b92c6b2 commit ed54e86

File tree

4 files changed

+82
-0
lines changed

4 files changed

+82
-0
lines changed

Foundation/include/Poco/Format.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ std::string Foundation_API format(const std::string& fmt, const Any& value);
6262
/// * e signed floating-point value in the form [-]d.dddde[<sign>]dd[d]
6363
/// * E signed floating-point value in the form [-]d.ddddE[<sign>]dd[d]
6464
/// * f signed floating-point value in the form [-]dddd.dddd
65+
/// * g use the shortest representation: %e or %f
66+
/// * G use the shortest representation: %E or %F
6567
/// * s std::string
6668
/// * v std::string_view
6769
/// * z std::size_t

Foundation/src/Format.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@ namespace
128128
case 'e': str << std::scientific; break;
129129
case 'E': str << std::scientific << std::uppercase; break;
130130
case 'f': str << std::fixed; break;
131+
case 'g': str << std::defaultfloat; break;
132+
case 'G': str << std::defaultfloat << std::uppercase; break;
131133
}
132134
}
133135

@@ -212,6 +214,8 @@ namespace
212214
case 'e':
213215
case 'E':
214216
case 'f':
217+
case 'g':
218+
case 'G':
215219
switch (mod)
216220
{
217221
case 'l': str << AnyCast<long double>(*itVal++); break;

Foundation/testsuite/src/FormatTest.cpp

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,80 @@ void FormatTest::testAnyInt()
325325
assertTrue (s == "42");
326326
}
327327

328+
void FormatTest::testShortestRepr()
329+
{
330+
std::string str;
331+
332+
//
333+
// uppercase tests
334+
//
335+
{
336+
str = format("%G", 123.456);
337+
assertEquals("123.456", str);
338+
339+
str = format("%G", 12345.6789);
340+
assertEquals("12345.7", str);
341+
342+
str = format("%G", 0.000123);
343+
assertEquals("0.000123", str);
344+
345+
str = format("%G", 1234567890.123);
346+
assertEquals("1.23457E+09", str);
347+
348+
str = format("%G", 0.0);
349+
assertEquals("0", str);
350+
351+
str = format("%G", -9876.54321);
352+
assertEquals("-9876.54", str);
353+
354+
str = format("%.2G", 123.456);
355+
assertEquals("1.2E+02", str);
356+
357+
str = format("%G", 1.0);
358+
assertEquals("1", str);
359+
360+
str = format("%G", 0.00000000123);
361+
assertEquals("1.23E-09", str);
362+
363+
str = format("%G", 0.00000000000123);
364+
assertEquals("1.23E-12", str);
365+
}
366+
367+
//
368+
// lowercase tests
369+
//
370+
{
371+
str = format("%g", 123.456);
372+
assertEquals("123.456", str);
373+
374+
str = format("%g", 12345.6789);
375+
assertEquals("12345.7", str);
376+
377+
str = format("%g", 0.000123);
378+
assertEquals("0.000123", str);
379+
380+
str = format("%g", 1234567890.123);
381+
assertEquals("1.23457e+09", str);
382+
383+
str = format("%g", 0.0);
384+
assertEquals("0", str);
385+
386+
str = format("%g", -9876.54321);
387+
assertEquals("-9876.54", str);
388+
389+
str = format("%.2g", 123.456);
390+
assertEquals("1.2e+02", str);
391+
392+
str = format("%g", 1.0);
393+
assertEquals("1", str);
394+
395+
str = format("%g", 0.00000000123);
396+
assertEquals("1.23e-09", str);
397+
398+
str = format("%g", 0.00000000000123);
399+
assertEquals("1.23e-12", str);
400+
}
401+
}
328402

329403
void FormatTest::testFloatFix()
330404
{
@@ -527,6 +601,7 @@ CppUnit::Test* FormatTest::suite()
527601
CppUnit_addTest(pSuite, FormatTest, testMultiple);
528602
CppUnit_addTest(pSuite, FormatTest, testIndex);
529603
CppUnit_addTest(pSuite, FormatTest, testAny);
604+
CppUnit_addTest(pSuite, FormatTest, testShortestRepr);
530605

531606
return pSuite;
532607
}

Foundation/testsuite/src/FormatTest.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class FormatTest: public CppUnit::TestCase
2929
void testFloatSci();
3030
void testString();
3131
void testStringView();
32+
void testShortestRepr();
3233
void testMultiple();
3334
void testIndex();
3435
void testAny();

0 commit comments

Comments
 (0)