svl/source/numbers/zformat.cxx | 68 ++++++++++++++++++++++++++++++++++------- 1 file changed, 58 insertions(+), 10 deletions(-)
New commits: commit 3363539e425d5d8f75d976ca2261c07086d6d06a Author: Laurent Balland-Poirier <laurent.balland-poir...@laposte.net> Date: Wed Jul 6 00:10:38 2016 +0200 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 <c...@libreoffice.org> Reviewed-by: Eike Rathke <er...@redhat.com> Tested-by: Eike Rathke <er...@redhat.com> diff --git a/svl/source/numbers/zformat.cxx b/svl/source/numbers/zformat.cxx index 9d5de1c..a638581 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(); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits