diff options
author | Laurent Balland-Poirier <laurent.balland-poirier@laposte.net> | 2017-02-26 19:40:30 +0100 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2017-03-02 18:06:50 +0000 |
commit | b2738c6f67cb650ac32228f3cd20b9dfe4b41c9c (patch) | |
tree | 53bae8a19dd4d2aefeb3dd3bef999eeba7a7b597 /svl/source/numbers/zforscan.cxx | |
parent | 7496f7d3cae8a932dc43ede8a30a99289366a264 (diff) |
tdf#106190 fix left alignment of denominator
The bug was introduced with left aligment of denominator.
Non feasable denominators were not tested and create infinite loop
while inserting and removing the same space.
This patch detects
- if denominator starts just after fraction bar.
Otherwise, format is faulty.
- if a non digit is detected in the denominator,
next part of format is treated as text
This patch is changing behavior of some formats:
"# ?/foo??" is treated as faulty format while it was considered as valid
"# ?/??E?" is treated with 2 digits in denominator and "E?" at the end,
while it was considered as faulty
Change-Id: I0379a398dff79b6e21a44776c0d4356d066cdeab
Reviewed-on: https://gerrit.libreoffice.org/34659
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Eike Rathke <erack@redhat.com>
Diffstat (limited to 'svl/source/numbers/zforscan.cxx')
-rw-r--r-- | svl/source/numbers/zforscan.cxx | 43 |
1 files changed, 32 insertions, 11 deletions
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 ) ) |