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 |
|
114 |
aValue.Erase( 0, nNum ); |
115 |
// numerical sequence ended. |
115 |
return -1; |
116 |
|
116 |
} |
117 |
if (nFirst == nLen) |
117 |
else |
118 |
nFirst = i; |
118 |
{ |
119 |
|
119 |
nNeg = 0; |
120 |
if (c == '.') |
120 |
xub_StrLen nEnd = nNum = aValue.Len() - 1; |
121 |
{ |
121 |
while ( nNum && CharClass::isAsciiNumeric( p[nNum] ) ) |
122 |
// if it's a dot, erase the buffer and keep going. |
122 |
nNum--; |
123 |
aBuf.Erase(); |
123 |
if ( p[nNum] == '-' ) |
124 |
nDot = i; |
124 |
{ |
125 |
continue; |
125 |
nNum--; |
126 |
} |
126 |
nNeg = 1; |
127 |
else if (aBuf.Len()) |
127 |
} |
128 |
{ |
128 |
if ( nNum < nEnd - nNeg ) |
129 |
// leading number |
129 |
{ // number at the end |
130 |
if (nDot < nLen) |
130 |
nVal = aValue.Copy( nNum + 1 ).ToInt32(); |
131 |
{ |
131 |
// #60893# any number with a leading zero sets the minimum number of digits |
132 |
// If a dot has been previously encounted, then use the first |
132 |
if ( p[nNum+1+nNeg] == '0' && pMinDigits && ( nEnd - nNum - nNeg > *pMinDigits ) ) |
133 |
// numerical segment. |
133 |
*pMinDigits = nEnd - nNum - nNeg; |
134 |
i = nFirst; |
134 |
aValue.Erase( nNum + 1 ); |
135 |
aBuf = aValue.Copy(0, nFirst); |
135 |
return 1; |
136 |
} |
136 |
} |
137 |
|
137 |
} |
138 |
nVal = aBuf.ToInt32(); |
|
|
139 |
if (nSign && p[0] == '-') |
140 |
nVal *= -1; |
141 |
aValue.Erase(0, i); |
142 |
if (pMinDigits) |
143 |
*pMinDigits = i - nSign; |
144 |
return -1; |
145 |
} |
146 |
} |
147 |
if (aBuf.Len()) |
148 |
{ |
149 |
// trailing number. |
150 |
xub_StrLen nBufLen = aBuf.Len(); |
151 |
nVal = aBuf.ToInt32(); |
152 |
aValue.Erase(nLen - nBufLen); |
153 |
if (pMinDigits) |
154 |
*pMinDigits = nBufLen; |
155 |
return 1; |
156 |
} |
157 |
|
138 |
nVal = 0; |
158 |
nVal = 0; |
139 |
return 0; |
159 |
return 0; |
140 |
} |
160 |
} |