summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Balland-Poirier <laurent.balland-poirier@laposte.net>2015-03-17 10:53:31 +0100
committerEike Rathke <erack@redhat.com>2015-03-23 09:21:59 +0000
commit86a318ce629fbddb442f8f8ca762eeb3a51c9c6e (patch)
treedf27d7468f2785218c68ce4503bd7131a2620766
parentc42f4d03a846c2dec379aec52da9c959848b5e52 (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.vb4
-rw-r--r--svl/source/numbers/zformat.cxx25
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);
}
}