summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--svl/source/numbers/zformat.cxx4
-rw-r--r--svl/source/numbers/zforscan.cxx43
-rw-r--r--svl/source/numbers/zforscan.hxx1
3 files changed, 35 insertions, 13 deletions
diff --git a/svl/source/numbers/zformat.cxx b/svl/source/numbers/zformat.cxx
index 5d5349ee8f70..1de8ffcdc8df 100644
--- a/svl/source/numbers/zformat.cxx
+++ b/svl/source/numbers/zformat.cxx
@@ -2836,9 +2836,9 @@ bool SvNumberformat::ImpGetFractionOutput(double fNumber,
sal_Int32 k; // Denominator
bRes |= ImpNumberFill(sDiv, fNumber, k, j, nIx, NF_SYMBOLTYPE_FRAC);
- if ( !bHideFraction )
+ if ( !bHideFraction && sDenominatorFormat.getLength() > 0 )
{
- while ( sDiv[0] == ' ' )
+ while ( sDiv[0] == ' ' ) // left align denominator
{
sDiv.insert( sDenominatorFormat.getLength(), " " );
sDiv.remove( 0, 1 );
diff --git a/svl/source/numbers/zforscan.cxx b/svl/source/numbers/zforscan.cxx
index 6b2093863317..485ec405084f 100644
--- a/svl/source/numbers/zforscan.cxx
+++ b/svl/source/numbers/zforscan.cxx
@@ -1079,6 +1079,7 @@ void ImpSvNumberformatScan::Reset()
nCntExp = 0;
bFrac = false;
bBlank = false;
+ bDenomin = false;
nNatNumModifier = 0;
}
@@ -1666,6 +1667,8 @@ sal_Int32 ImpSvNumberformatScan::FinalScan( OUString& rString )
}
else if ( sStrArray[i][0] == ' ' )
nTypeArray[i] = NF_SYMBOLTYPE_FRACBLANK;
+ else if ( bFrac )
+ bDenomin = true; // following elements are no more part of denominator
}
else if (nTypeArray[i] == NF_KEY_THAI_T)
{
@@ -1673,7 +1676,7 @@ sal_Int32 ImpSvNumberformatScan::FinalScan( OUString& rString )
sStrArray[i] = sKeyword[nTypeArray[i]];
}
else if (sStrArray[i][0] >= '0' &&
- sStrArray[i][0] <= '9')
+ sStrArray[i][0] <= '9' && !bDenomin) // denominator was not yet found
{
OUString sDiv;
sal_uInt16 j = i;
@@ -1702,10 +1705,14 @@ sal_Int32 ImpSvNumberformatScan::FinalScan( OUString& rString )
{
nCntPre++;
}
+ if ( bFrac )
+ bDenomin = true; // next content should be treated as outside denominator
}
}
else
{
+ if ( bFrac )
+ bDenomin = true; // next content should be treated as outside denominator
nTypeArray[i] = NF_SYMBOLTYPE_STRING;
}
nPos = nPos + sStrArray[i].getLength();
@@ -1741,19 +1748,27 @@ sal_Int32 ImpSvNumberformatScan::FinalScan( OUString& rString )
{
return nPos; // Error
}
- nTypeArray[i] = NF_SYMBOLTYPE_DIGIT;
- nPos = nPos + rStr.getLength();
- i++;
- nCounter++;
- while (i < nAnzStrings &&
- (sStrArray[i][0] == '#' ||
- sStrArray[i][0] == '0' ||
- sStrArray[i][0] == '?'))
+ if ( !bDenomin )
{
nTypeArray[i] = NF_SYMBOLTYPE_DIGIT;
- nPos = nPos + sStrArray[i].getLength();
- nCounter++;
+ nPos = nPos + rStr.getLength();
i++;
+ nCounter++;
+ while (i < nAnzStrings &&
+ (sStrArray[i][0] == '#' ||
+ sStrArray[i][0] == '0' ||
+ sStrArray[i][0] == '?'))
+ {
+ nTypeArray[i] = NF_SYMBOLTYPE_DIGIT;
+ nPos = nPos + sStrArray[i].getLength();
+ nCounter++;
+ i++;
+ }
+ }
+ else // after denominator, treat any character as text
+ {
+ nTypeArray[i] = NF_SYMBOLTYPE_STRING;
+ nPos = nPos + sStrArray[i].getLength();
}
break;
case '-':
@@ -1816,6 +1831,8 @@ sal_Int32 ImpSvNumberformatScan::FinalScan( OUString& rString )
else
{
nTypeArray[i] = NF_SYMBOLTYPE_STRING;
+ if ( bFrac )
+ bDenomin = true; // end of denominator
}
}
else if (i > 0 && i < nAnzStrings-1 &&
@@ -1982,12 +1999,16 @@ sal_Int32 ImpSvNumberformatScan::FinalScan( OUString& rString )
nCntPre = nCounter;
nCounter = 0;
}
+ if ( bFrac )
+ bDenomin = true; // next content is not part of denominator
nTypeArray[i] = NF_SYMBOLTYPE_STRING;
nPos = nPos + sStrArray[i].getLength();
}
else
{
nTypeArray[i] = NF_SYMBOLTYPE_STRING;
+ if ( bFrac )
+ bDenomin = true; // next content is not part of denominator
nPos = nPos + rStr.getLength();
i++;
while (i < nAnzStrings && StringEqualsChar( sStrArray[i], cSaved ) )
diff --git a/svl/source/numbers/zforscan.hxx b/svl/source/numbers/zforscan.hxx
index 001abe6de491..e0cec64bc859 100644
--- a/svl/source/numbers/zforscan.hxx
+++ b/svl/source/numbers/zforscan.hxx
@@ -174,6 +174,7 @@ private: // Private section
bool bExp; // Set when reading E
bool bFrac; // Set when reading /
bool bBlank; // Set when reading ' ' (Fraction)
+ bool bDenomin; // Set when reading end of denominator
bool bDecSep; // Set on first ,
mutable bool bKeywordsNeedInit; // Locale dependent keywords need to be initialized
mutable bool bCompatCurNeedInit; // Locale dependent compatibility currency need to be initialized