View | Details | Raw Unified | Return to issue 5550
Collapse All | Expand All

(-)sc/source/core/data/table4.cxx (-37 / +59 lines)
Lines 93-140 extern USHORT nScFillModeMouseModifier; // global.cxx Link Here
93
93
94
short lcl_DecompValueString( String& aValue, sal_Int32& nVal, USHORT* pMinDigits = NULL )
94
short lcl_DecompValueString( String& aValue, sal_Int32& nVal, USHORT* pMinDigits = NULL )
95
{
95
{
96
	if ( !aValue.Len() )
96
    xub_StrLen nLen = aValue.Len();
97
	if (!nLen)
97
	{
98
	{
98
		nVal = 0;
99
		nVal = 0;
99
		return 0;
100
		return 0;
100
	}
101
	}
101
	const sal_Unicode* p = aValue.GetBuffer();
102
	const sal_Unicode* p = aValue.GetBuffer();
102
	xub_StrLen nNeg = 0;
103
    xub_StrLen nSign = (p[0] == '+' || p[0] == '-') ? 1 : 0;
103
	xub_StrLen nNum = 0;
104
    xub_StrLen nDot = nLen, nFirst = nLen;
104
	if ( p[nNum] == '-' )
105
    String aBuf;
105
		nNum = nNeg = 1;
106
    for (xub_StrLen i = nSign; i < nLen; ++i)
106
	while ( p[nNum] && CharClass::isAsciiNumeric( p[nNum] ) )
107
    {
107
		nNum++;
108
        sal_Unicode c = p[i];
108
	if ( nNum > nNeg )
109
        if (CharClass::isAsciiNumeric(c) && c != '+' && c != '-')
109
	{	// number at the beginning
110
        {
110
		nVal = aValue.Copy( 0, nNum ).ToInt32();
111
            aBuf.Append(c);
111
		//	#60893# any number with a leading zero sets the minimum number of digits
112
            continue;
112
		if ( p[nNeg] == '0' && pMinDigits && ( nNum - nNeg > *pMinDigits ) )
113
        }
113
			*pMinDigits = nNum - nNeg;
114
        else
114
		aValue.Erase( 0, nNum );
115
            aBuf.Erase();
115
		return -1;
116
116
	}
117
        // numerical sequence ended.
117
	else
118
118
	{
119
        if (nFirst == nLen)
119
		nNeg = 0;
120
            nFirst = i;
120
		xub_StrLen nEnd = nNum = aValue.Len() - 1;
121
121
		while ( nNum && CharClass::isAsciiNumeric( p[nNum] ) )
122
        if (c == '.')
122
			nNum--;
123
        {
123
		if ( p[nNum] == '-' )
124
            // if it's a dot, erase the buffer and keep going.
124
		{
125
            aBuf.Erase();
125
			nNum--;
126
            nDot = i;
126
			nNeg = 1;
127
            continue;
127
		}
128
        }
128
		if ( nNum < nEnd - nNeg )
129
        else if (aBuf.Len())
129
		{	// number at the end
130
        {
130
			nVal = aValue.Copy( nNum + 1 ).ToInt32();
131
            // leading number
131
			//	#60893# any number with a leading zero sets the minimum number of digits
132
            if (nDot < nLen)
132
			if ( p[nNum+1+nNeg] == '0' && pMinDigits && ( nEnd - nNum - nNeg > *pMinDigits ) )
133
            {
133
				*pMinDigits = nEnd - nNum - nNeg;
134
                // If a dot has been previously encountered, then use the
134
			aValue.Erase( nNum + 1 );
135
                // first numerical segment.
135
			return 1;
136
                i = nFirst;
136
		}
137
                aBuf = aValue.Copy(0, nFirst);
137
	}
138
            }
139
140
            nVal = aBuf.ToInt32();
141
            if (nSign && p[0] == '-')
142
                nVal *= -1;
143
            aValue.Erase(0, i);
144
            if (pMinDigits)
145
                *pMinDigits = i - nSign;
146
            return -1;
147
        }
148
    }
149
    if (aBuf.Len())
150
    {
151
        // trailing number.
152
        xub_StrLen nBufLen = aBuf.Len();
153
        nVal = aBuf.ToInt32();
154
        aValue.Erase(nLen - nBufLen);
155
        if (pMinDigits)
156
            *pMinDigits = nBufLen;
157
        return 1;
158
    }
159
138
	nVal = 0;
160
	nVal = 0;
139
	return 0;
161
	return 0;
140
}
162
}

Return to issue 5550