summaryrefslogtreecommitdiff
path: root/svl
diff options
context:
space:
mode:
authorKohei Yoshida <kyoshida@novell.com>2010-02-03 21:44:04 -0500
committerKohei Yoshida <kyoshida@novell.com>2010-02-03 21:44:04 -0500
commit624a9db6cff42903d72a58784f7b247be727062d (patch)
tree28e33e4a37944846e6085ce4e61474b16805caa7 /svl
parent6b99f11ceda31108850dc37e96351f2396d93d29 (diff)
koheiautodecimal: #i26826# Prefer scientific notation for values less than 1.0E-4.
Diffstat (limited to 'svl')
-rw-r--r--svl/source/numbers/zformat.cxx27
1 files changed, 27 insertions, 0 deletions
diff --git a/svl/source/numbers/zformat.cxx b/svl/source/numbers/zformat.cxx
index 8c49ed34c5a7..56cb6c80eb63 100644
--- a/svl/source/numbers/zformat.cxx
+++ b/svl/source/numbers/zformat.cxx
@@ -71,6 +71,7 @@ struct Gregorian
};
const sal_uInt16 UPPER_PRECISION = 300; // entirely arbitrary...
+const double EXP_LOWER_BOUND = 1.0E-4; // prefer scientific notation below this value.
}
@@ -2012,6 +2013,12 @@ bool SvNumberformat::GetOutputString(double fNumber, sal_uInt16 nCharCount, Stri
if (bSign)
fTestNum = -fTestNum;
+ if (fTestNum < EXP_LOWER_BOUND)
+ {
+ lcl_GetOutputStringScientific(fNumber, nCharCount, GetFormatter(), rOutString);
+ return true;
+ }
+
double fExp = log10(fTestNum);
// Values < 1.0 always have one digit before the decimal point.
sal_uInt16 nDigitPre = fExp >= 0.0 ? static_cast<sal_uInt16>(ceil(fExp)) : 1;
@@ -2072,7 +2079,27 @@ BOOL SvNumberformat::GetOutputString(double fNumber,
{
if (rScan.GetStandardPrec() == SvNumberFormatter::UNLIMITED_PRECISION)
{
+ bool bSign = ::rtl::math::isSignBitSet(fNumber);
+ if (bSign)
+ fNumber = -fNumber;
ImpGetOutputInputLine(fNumber, OutString);
+ if (fNumber < EXP_LOWER_BOUND)
+ {
+ xub_StrLen nLen = OutString.Len();
+ if (!nLen)
+ return false;
+
+ if (nLen > 11)
+ {
+ sal_uInt16 nStandardPrec = rScan.GetStandardPrec();
+ nStandardPrec = ::std::min(nStandardPrec, static_cast<sal_uInt16>(14)); // limits to 14 decimals
+ OutString = ::rtl::math::doubleToUString( fNumber,
+ rtl_math_StringFormat_E, nStandardPrec /*2*/,
+ GetFormatter().GetNumDecimalSep().GetChar(0), true);
+ }
+ }
+ if (bSign)
+ OutString.Insert('-', 0);
return false;
}
ImpGetOutputStandard(fNumber, OutString);