svl/source/numbers/zforfind.cxx | 42 ++++++++++++++++++++++++++++++++-------- svl/source/numbers/zforfind.hxx | 2 - 2 files changed, 35 insertions(+), 9 deletions(-)
New commits: commit 91ccd9fda9c953dbe88b99673491aabeb64ff330 Author: Eike Rathke <er...@redhat.com> AuthorDate: Fri Jul 3 19:09:33 2020 +0200 Commit: Eike Rathke <er...@redhat.com> CommitDate: Mon Jul 6 13:10:43 2020 +0200 Resolves: tdf#131562 decimal separator may not be surrounded by blanks 1 . 1 .2 1 . 2 1. 2 . 2 . 2 are not numbers. But .2 is. Change-Id: Ie2e0775852e13eee733d0fed3399cbd3d065d9fe Reviewed-on: https://gerrit.libreoffice.org/c/core/+/97895 Tested-by: Jenkins Reviewed-by: Eike Rathke <er...@redhat.com> (cherry picked from commit 7186541219599e1b51ad35601c2cd015a329f360) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/98074 diff --git a/svl/source/numbers/zforfind.cxx b/svl/source/numbers/zforfind.cxx index 88ef3584c46a..42ffbd325bac 100644 --- a/svl/source/numbers/zforfind.cxx +++ b/svl/source/numbers/zforfind.cxx @@ -499,9 +499,10 @@ inline bool ImpSvNumberInputScan::SkipChar( sal_Unicode c, const OUString& rStri /** * Skips blanks */ -inline void ImpSvNumberInputScan::SkipBlanks( const OUString& rString, +inline bool ImpSvNumberInputScan::SkipBlanks( const OUString& rString, sal_Int32& nPos ) { + sal_Int32 nHere = nPos; if ( nPos < rString.getLength() ) { const sal_Unicode* p = rString.getStr() + nPos; @@ -511,6 +512,7 @@ inline void ImpSvNumberInputScan::SkipBlanks( const OUString& rString, p++; } } + return nHere < nPos; } @@ -2271,10 +2273,13 @@ bool ImpSvNumberInputScan::ScanStartString( const OUString& rString ) if (nSign && nPos == rString.getLength()) return true; + const sal_Int32 nStartBlanks = nPos; if ( GetDecSep(rString, nPos) ) // decimal separator in start string { - nDecPos = 1; - SkipBlanks(rString, nPos); + if (SkipBlanks(rString, nPos)) + nPos = nStartBlanks; // `. 2` not a decimal separator + else + nDecPos = 1; // leading decimal separator } else if ( GetCurrency(rString, nPos) ) // currency (DM 1)? { @@ -2290,8 +2295,13 @@ bool ImpSvNumberInputScan::ScanStartString( const OUString& rString ) } if ( GetDecSep(rString, nPos) ) // decimal separator follows currency { - nDecPos = 1; - SkipBlanks(rString, nPos); + if (SkipBlanks(rString, nPos)) + { + nPos = nStartBlanks; // `DM . 2` not a decimal separator + eScannedType = SvNumFormatType::UNDEFINED; // !!! it is NOT currency !!! + } + else + nDecPos = 1; // leading decimal separator } } else @@ -2442,7 +2452,8 @@ bool ImpSvNumberInputScan::ScanMidString( const OUString& rString, sal_uInt16 nS } } - SkipBlanks(rString, nPos); + const sal_Int32 nStartBlanks = nPos; + const bool bBlanks = SkipBlanks(rString, nPos); if (GetDecSep(rString, nPos)) // decimal separator? { if (nDecPos == 1 || nDecPos == 3) // .12.4 or 1.E2.1 @@ -2472,10 +2483,19 @@ bool ImpSvNumberInputScan::ScanMidString( const OUString& rString, sal_uInt16 nS return MatchedReturn(); } } + else if (bBlanks) + { + // `1 .2` or `1 . 2` not a decimal separator, reset + nPos = nStartBlanks; + } + else if (SkipBlanks(rString, nPos)) + { + // `1. 2` not a decimal separator, reset + nPos = nStartBlanks; + } else { nDecPos = 2; // . in mid string - SkipBlanks(rString, nPos); } } else if ( (eScannedType & SvNumFormatType::TIME) && @@ -2798,7 +2818,8 @@ bool ImpSvNumberInputScan::ScanEndString( const OUString& rString ) } } - SkipBlanks(rString, nPos); + const sal_Int32 nStartBlanks = nPos; + const bool bBlanks = SkipBlanks(rString, nPos); if (GetDecSep(rString, nPos)) // decimal separator? { if (nDecPos == 1 || nDecPos == 3) // .12.4 or 12.E4. @@ -2828,6 +2849,11 @@ bool ImpSvNumberInputScan::ScanEndString( const OUString& rString ) return MatchedReturn(); } } + else if (bBlanks) + { + // not a decimal separator, reset + nPos = nStartBlanks; + } else { nDecPos = 3; // . in end string diff --git a/svl/source/numbers/zforfind.hxx b/svl/source/numbers/zforfind.hxx index 332f0ef6ef94..0c66cb46f770 100644 --- a/svl/source/numbers/zforfind.hxx +++ b/svl/source/numbers/zforfind.hxx @@ -264,7 +264,7 @@ private: sal_Int32& nPos ); // Skip blank - static inline void SkipBlanks( const OUString& rString, + static inline bool SkipBlanks( const OUString& rString, sal_Int32& nPos ); // Jump over rWhat in rString at nPos _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits