We figured out today that
'blabla1230' squeezeOutNumber ==> 123 But it should be 1230. So after multiple attempts to debug this expression (with strange behaviors), we discovered that it's while parsing the reversed version of the string that it fails[1] Indeed, when reversed, the trailing 0 become a leading 0, and is ignored (which in our case is wrong). So we removed this part, and all the tests are green again. But still we were wondering if the piece of code is needed somewhere or not ? Thanks in advance, Ben and Cami [1]:squeezeNumberOutOfString: stringOrStream onError: errorBlock "Try and find a number in this string. First, look if the string starts with a number. Then, see if it ends with a number. Then, remove a character from the front and see if the remaining string makes a number. Repeat the process until no characters are left or the number has been found. As soon as a number is found, it is returned. Otherwise, the method fails." | string try | stringOrStream isEmpty ifTrue: errorBlock. (self parse: stringOrStream onError: [nil]) ifNotNilDo: [:result | ^ result ]. (self parse: stringOrStream asString copy reversed onError: [nil]) ifNotNilDo: [:result | ^ result asString reversed asNumber]. string := stringOrStream. "We do the loop n-1 times because at the n-th iteration, string is empty" (stringOrStream size -1) timesRepeat: [ string := string allButFirst. (self parse: string onError: [ nil ]) ifNotNilDo: [ :result| ^ result ].]. ^ errorBlock value |
On 01 Jul 2012, at 02:15, Benjamin wrote: > We figured out today that > > 'blabla1230' squeezeOutNumber ==> 123 > > But it should be 1230. > > So after multiple attempts to debug this expression (with strange behaviors), we discovered that it's while parsing the reversed version of the string that it fails[1] > Indeed, when reversed, the trailing 0 become a leading 0, and is ignored (which in our case is wrong). > > So we removed this part, and all the tests are green again. > But still we were wondering if the piece of code is needed somewhere or not ? You made it simpler and the tests succeed, ergo it is better. Is this needed/necessary, that is another question. I would guess that the reversing was a kind of optimization. > Thanks in advance, > Ben and Cami > > > > [1]:squeezeNumberOutOfString: stringOrStream onError: errorBlock > "Try and find a number in this string. First, look if the string > starts with a number. Then, see if it ends with a number. Then, > remove a character from the front and see if the remaining > string makes a number. Repeat the process until no characters > are left or the number has been found. As soon as a number is > found, it is returned. Otherwise, the method fails." > > | string try | > > stringOrStream isEmpty ifTrue: errorBlock. > > (self parse: stringOrStream onError: [nil]) > ifNotNilDo: [:result | ^ result ]. > > (self parse: stringOrStream asString copy reversed onError: [nil]) > ifNotNilDo: [:result | ^ result asString reversed asNumber]. > > string := stringOrStream. > "We do the loop n-1 times because at the n-th iteration, string is empty" > (stringOrStream size -1) timesRepeat: [ > string := string allButFirst. > (self parse: string onError: [ nil ]) > ifNotNilDo: [ :result| ^ result ].]. > > ^ errorBlock value |
Free forum by Nabble | Edit this page |