summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Balland-Poirier <laurent.balland-poirier@laposte.net>2016-07-06 00:10:38 +0200
committerEike Rathke <erack@redhat.com>2016-07-22 10:38:18 +0000
commit3363539e425d5d8f75d976ca2261c07086d6d06a (patch)
tree7543d10c2b92c61041255722be5da9005563c96c
parentc13d130024c52598ef687a4cb189f6d77804de1d (diff)
tdf#100834 String between integer and fraction
Fraction number format Insert Blank delimiter string between Integer/Fraction only if both of them are present In other cases, replace string with blank string if there are some '?' in formats Else insert nothing. If there is no fraction part, insert blank instead of '/' if there are some '?' in formats Change-Id: Ib606bdaa2b3809f15ce23acc3b5b6ee3fdbd230d Reviewed-on: https://gerrit.libreoffice.org/27252 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Eike Rathke <erack@redhat.com> Tested-by: Eike Rathke <erack@redhat.com>
-rw-r--r--svl/source/numbers/zformat.cxx68
1 files changed, 58 insertions, 10 deletions
diff --git a/svl/source/numbers/zformat.cxx b/svl/source/numbers/zformat.cxx
index 9d5de1c8b89f..a63858172572 100644
--- a/svl/source/numbers/zformat.cxx
+++ b/svl/source/numbers/zformat.cxx
@@ -2002,6 +2002,24 @@ OUString lcl_GetNumeratorString(const ImpSvNumberformatInfo &rInfo, sal_uInt16 n
return aNumeratorString.makeStringAndClear();
}
+OUString lcl_GetFractionIntegerString(const ImpSvNumberformatInfo &rInfo, sal_uInt16 nAnz)
+{
+ sal_Int16 i;
+ OUStringBuffer aIntegerString;
+ for( i = 0; i < nAnz; i++ )
+ {
+ if( rInfo.nTypeArray[i] == NF_SYMBOLTYPE_FRACBLANK )
+ {
+ for( i--; i >= 0 && rInfo.nTypeArray[i] == NF_SYMBOLTYPE_DIGIT ; i-- )
+ {
+ aIntegerString.insert( 0, rInfo.sStrArray[i] );
+ }
+ i = nAnz;
+ }
+ }
+ return aIntegerString.makeStringAndClear();
+}
+
}
OUString SvNumberformat::GetDenominatorString( sal_uInt16 nNumFor ) const
@@ -2397,6 +2415,9 @@ bool SvNumberformat::ImpGetFractionOutput(double fNumber,
OUStringBuffer sStr, sFrac, sDiv; // Strings, value for
sal_uInt64 nFrac=0, nDiv=1; // Integral part
bool bSign = false; // Numerator and denominator
+ const OUString sIntegerFormat = lcl_GetFractionIntegerString(rInfo, nAnz);
+ const OUString sNumeratorFormat = lcl_GetNumeratorString(rInfo, nAnz);
+ const OUString sDenominatorFormat = lcl_GetDenominatorString(rInfo, nAnz);
if (fNumber < 0)
{
@@ -2420,7 +2441,7 @@ bool SvNumberformat::ImpGetFractionOutput(double fNumber,
return false;
}
- if( sal_Int32 nForcedDiv = lcl_GetDenominatorString(rInfo, nAnz).toInt32() )
+ if( sal_Int32 nForcedDiv = sDenominatorFormat.toInt32() )
{ // Forced Denominator
nDiv = (sal_uInt64) nForcedDiv;
nFrac = (sal_uInt64)floor ( fNumber * nDiv );
@@ -2500,9 +2521,9 @@ bool SvNumberformat::ImpGetFractionOutput(double fNumber,
impTransliterate(sStr, NumFor[nIx].GetNatNum());
}
bool bHideFraction = (rInfo.nCntPre > 0 && nFrac == 0
- && (lcl_GetNumeratorString(rInfo, nAnz).indexOf('0') < 0)
- && (lcl_GetDenominatorString(rInfo, nAnz).indexOf('0') < 0
- || lcl_GetDenominatorString(rInfo, nAnz).toInt32() > 0) );
+ && (sNumeratorFormat.indexOf('0') < 0)
+ && (sDenominatorFormat.indexOf('0') < 0
+ || sDenominatorFormat.toInt32() > 0) );
if ( bHideFraction )
{
sDiv.truncate();
@@ -2522,8 +2543,10 @@ bool SvNumberformat::ImpGetFractionOutput(double fNumber,
if (rInfo.nTypeArray[j] == NF_SYMBOLTYPE_FRAC)
{
if ( bHideFraction )
- {
- sDiv.insert(0, ' ');
+ { // do not insert blank for fraction if there is no '?'
+ if ( sNumeratorFormat.indexOf('?') >= 0
+ || sDenominatorFormat.indexOf('?') >= 0 )
+ sDiv.insert(0, ' ');
}
else
{
@@ -2546,18 +2569,43 @@ bool SvNumberformat::ImpGetFractionOutput(double fNumber,
else
{
bRes |= ImpNumberFill(sFrac, fNumber, k, j, nIx, NF_SYMBOLTYPE_FRACBLANK);
- bCont = false; // there is no main number?
+ bCont = false; // there is no integer part?
if (rInfo.nTypeArray[j] == NF_SYMBOLTYPE_FRACBLANK)
{
- sFrac.insert(0, rInfo.sStrArray[j]);
if ( j )
{
+ if ( bHideFraction )
+ { // '?' in any format force display of blank as delimiter
+ if ( sIntegerFormat.indexOf('?') >= 0
+ || sNumeratorFormat.indexOf('?') >= 0
+ || sDenominatorFormat.indexOf('?') >= 0 )
+ {
+ for (sal_uInt16 i = 0; i < rInfo.sStrArray[j].getLength(); i++)
+ sFrac.insert(0, ' ');
+ }
+ }
+ else
+ {
+ if ( fNum != 0.0 || sIntegerFormat.indexOf('0') >= 0 )
+ sFrac.insert(0, rInfo.sStrArray[j]); // insert Blank string only if there are both integer and fraction
+ else
+ {
+ if ( sIntegerFormat.indexOf('?') >= 0
+ || sNumeratorFormat.indexOf('?') >= 0 )
+ {
+ for (sal_uInt16 i = 0; i < rInfo.sStrArray[j].getLength(); i++)
+ sFrac.insert(0, ' ');
+ }
+ }
+ }
j--;
- bCont = true; // Yes, there is a main number
+ bCont = true; // Yes, there is an integer
}
+ else
+ sFrac.insert(0, rInfo.sStrArray[j]);
}
}
- // Continue main number
+ // Continue integer part
if ( !bCont )
{
sStr.truncate();