diff options
author | Laurent Balland-Poirier <laurent.balland-poirier@laposte.net> | 2015-03-17 10:53:31 +0100 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2015-03-23 09:21:59 +0000 |
commit | 86a318ce629fbddb442f8f8ca762eeb3a51c9c6e (patch) | |
tree | df27d7468f2785218c68ce4503bd7131a2620766 | |
parent | c42f4d03a846c2dec379aec52da9c959848b5e52 (diff) |
tdf#30716 Engineering notation
Implement engineering notation: fomat ##0.00E+00 for instance
Saved in ODF thanks to https://gerrit.libreoffice.org/14875/
Change-Id: I1e401183a95ce05481a9af52e49bbcfe08cd1a20
Reviewed-on: https://gerrit.libreoffice.org/14886
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Eike Rathke <erack@redhat.com>
Tested-by: Eike Rathke <erack@redhat.com>
-rw-r--r-- | basic/qa/vba_tests/format.vb | 4 | ||||
-rw-r--r-- | svl/source/numbers/zformat.cxx | 25 |
2 files changed, 19 insertions, 10 deletions
diff --git a/basic/qa/vba_tests/format.vb b/basic/qa/vba_tests/format.vb index b4f19281ba25..54b5610851aa 100644 --- a/basic/qa/vba_tests/format.vb +++ b/basic/qa/vba_tests/format.vb @@ -296,8 +296,8 @@ Sub Custom_Number_Format_Sample() TestLog_ASSERT TestStr = "1,000,000", "#,###: " & TestStr 'MsgBox TestStr - TestStr = Format(1.09837555, "######E-###") '109838E-5 - TestLog_ASSERT TestStr = "109838E-5", "######E-###: " & TestStr + TestStr = Format(1.09837555, "######E-###") '109838E-5 => 1E0 with engineering notation + TestLog_ASSERT TestStr = "1E0", "######E-###: " & TestStr 'MsgBox TestStr TestStr = Format(2345.25, "$#,###.##") '$2.345.25 diff --git a/svl/source/numbers/zformat.cxx b/svl/source/numbers/zformat.cxx index e27348479985..41a99e8a8d0c 100644 --- a/svl/source/numbers/zformat.cxx +++ b/svl/source/numbers/zformat.cxx @@ -2296,18 +2296,14 @@ bool SvNumberformat::ImpGetScientificOutput(double fNumber, } ExpStr = sStr.toString().copy( nExpStart ); // part following the "E+" sStr.truncate( nExPos ); - // cut any decimal delimiter - sal_Int32 index = 0; - while((index = sStr.indexOf('.', index)) >= 0) - { - sStr.remove(index, 1); - } if ( rInfo.nCntPre != 1 ) // rescale Exp { sal_Int32 nExp = ExpStr.toString().toInt32() * nExpSign; - - nExp -= (sal_Int32)rInfo.nCntPre - 1; + sal_Int32 nRescale = (rInfo.nCntPre != 0) ? nExp % (sal_Int32)rInfo.nCntPre : -1; + if( nRescale < 0 && rInfo.nCntPre != 0 ) + nRescale += (sal_Int32)rInfo.nCntPre; + nExp -= nRescale; if ( nExp < 0 ) { nExpSign = -1; @@ -2318,6 +2314,19 @@ bool SvNumberformat::ImpGetScientificOutput(double fNumber, nExpSign = 1; } ExpStr = OUString::number( nExp ); + // rescale mantissa + sStr = ::rtl::math::doubleToUString( fNumber, + rtl_math_StringFormat_E, + nRescale + rInfo.nCntPost, '.' ); + sStr.truncate( sStr.indexOf('E') ); + } + + // cut any decimal delimiter + sal_Int32 index = 0; + + while((index = sStr.indexOf('.', index)) >= 0) + { + sStr.remove(index, 1); } } |