From 1d57ef8c3a6ce3d3fd91f35a3773b727affbb7ff Mon Sep 17 00:00:00 2001 From: jordanmontt Date: Fri, 18 Oct 2024 15:41:46 +0200 Subject: [PATCH 1/9] Added extractIntegerPart method. Changed asInteger, asUnsignedInteger and asSignedInteger implementations to return error when the int cannot be parsed. --- src/Collections-Strings/String.class.st | 44 ++++++++++++++++--------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/src/Collections-Strings/String.class.st b/src/Collections-Strings/String.class.st index 581d48c1dda..a9c40e9f9ea 100644 --- a/src/Collections-Strings/String.class.st +++ b/src/Collections-Strings/String.class.st @@ -696,13 +696,16 @@ String >> asHex [ { #category : 'converting' } String >> asInteger [ - "Return the integer present in the receiver, or nil. In case of float, returns the integer part." + "Return the integer present in the receiver. The receiver has to be a valid integer." + "'1' asInteger >>> 1" "'-1' asInteger >>> -1" "'10' asInteger >>> 10" - "'a' asInteger >>> nil" "'1.234' asInteger >>> 1" - ^self asSignedInteger + + (NumberParser isNumber: self) ifFalse: [ + self error: 'The string is not a valid integer' ]. + ^ NumberParser parse: self ] { #category : 'converting' } @@ -745,13 +748,12 @@ String >> asPluralBasedOn: aNumberOrCollection [ String >> asSignedInteger [ "Returns the first signed integer it can find or nil." - | start stream | - start := self findFirst: [:char | char isDigit]. - start isZero ifTrue: [^ nil]. - stream := self readStream position: start - 1. - ((stream position ~= 0) and: [stream peekBack = $-]) - ifTrue: [stream back]. - ^ Integer readFrom: stream + self + deprecated: + 'Use #asInteger to convert to a valid integer. If you want to extract the integer part, use #extractIntegerPart' + transformWith: + '`@receiver asSignedInteger' -> '`@receiver extractIntegerPart'. + ^ self extractIntegerPart ] { #category : 'converting' } @@ -776,12 +778,9 @@ String >> asTime [ { #category : 'converting' } String >> asUnsignedInteger [ - "Returns the first integer it can find or nil." - | start stream | - start := self findFirst: [ :char | char isDigit ]. - start isZero ifTrue: [ ^ nil ]. - stream := self readStream position: start - 1. - ^ Integer readFrom: stream + + + ^ self asInteger abs ] { #category : 'converting' } @@ -1384,6 +1383,19 @@ String >> expandMacrosWithArguments: anArray [ ifFalse: [ char ]) ] ] ] ] +{ #category : 'converting' } +String >> extractIntegerPart [ + "Returns the first signed integer it can find or nil." + + | start stream | + start := self findFirst: [ :char | char isDigit ]. + start isZero ifTrue: [ ^ nil ]. + stream := self readStream position: start - 1. + (stream position ~= 0 and: [ stream peekBack = $- ]) ifTrue: [ + stream back ]. + ^ Integer readFrom: stream +] + { #category : 'finding/searching' } String >> findAnySubstring: aCollection startingAt: start [ "Answer the index where an element of aCollection begins. If none are found, answer size + 1. aCollection is an Array of Strings or Characters." From cd87b0ff00e7ea3f6972e898bf62073083e56974 Mon Sep 17 00:00:00 2001 From: jordanmontt Date: Fri, 18 Oct 2024 15:42:19 +0200 Subject: [PATCH 2/9] Improved tests --- .../StringTest.class.st | 28 ++++++++++++++++--- .../WideStringTest.class.st | 21 -------------- 2 files changed, 24 insertions(+), 25 deletions(-) diff --git a/src/Collections-Strings-Tests/StringTest.class.st b/src/Collections-Strings-Tests/StringTest.class.st index 9093924a28e..33c480eca0a 100644 --- a/src/Collections-Strings-Tests/StringTest.class.st +++ b/src/Collections-Strings-Tests/StringTest.class.st @@ -447,11 +447,11 @@ StringTest >> testAsHTMLString [ { #category : 'tests - converting' } StringTest >> testAsInteger [ - self assert: '1796exportFixes-tkMX' asInteger equals: 1796. - self assert: 'donald' asInteger isNil. - self assert: 'abc234def567' asInteger equals: 234. + self should: [ '1796exportFixes-tkMX' asInteger ] raise: Error. + self should: [ 'donald' asInteger ] raise: Error. + self should: [ 'abc234def567' asInteger ] raise: Error. self assert: '-94' asInteger equals: -94. - self assert: 'foo-bar-92' asInteger equals: -92 + self assert: '9432' asInteger equals: 9432 ] { #category : 'tests' } @@ -540,6 +540,16 @@ StringTest >> testAsTime [ self assert: '13' asTime asString equals: '1:00 pm' ] +{ #category : 'tests' } +StringTest >> testAsUnsignedInteger [ + + self should: [ 'test' asUnsignedInteger ] raise: Error. + self should: [ 'test-10test' asUnsignedInteger ] raise: Error. + self assert: '-1234567890' asUnsignedInteger equals: 1234567890. + self assert: '-12345' asUnsignedInteger equals: 12345. + self assert: '111' asUnsignedInteger equals: 111 +] + { #category : 'tests' } StringTest >> testAsUppercase [ @@ -867,6 +877,16 @@ StringTest >> testExpandMacrosWithArgumentsLongText [ self assert: ('<1p>' expandMacrosWith: ('a' repeat: 100000)) size equals: 100002 ] +{ #category : 'tests' } +StringTest >> testExtractIntegerPart [ + + self assert: '1796exportFixes-tkMX' extractIntegerPart equals: 1796. + self assert: 'donald' extractIntegerPart isNil. + self assert: 'abc234def567' extractIntegerPart equals: 234. + self assert: '-94' extractIntegerPart equals: -94. + self assert: 'foo-bar-92' extractIntegerPart equals: -92 +] + { #category : 'tests' } StringTest >> testFindAnySubstringStartingAt [ diff --git a/src/Collections-Strings-Tests/WideStringTest.class.st b/src/Collections-Strings-Tests/WideStringTest.class.st index 62feaf5da89..c770763af83 100644 --- a/src/Collections-Strings-Tests/WideStringTest.class.st +++ b/src/Collections-Strings-Tests/WideStringTest.class.st @@ -18,27 +18,6 @@ WideStringTest >> classToBeTested [ ^ WideString ] -{ #category : 'tests - converting' } -WideStringTest >> testAsInteger [ - self assert: '1796exportFixes-tkMX' asWideString asInteger equals: 1796. - self assert: 'donald' asWideString asInteger isNil. - self assert: 'abc234def567' asWideString asInteger equals: 234. - self assert: '-94' asWideString asInteger equals: -94. - self assert: 'foo-bar-92' asWideString asInteger equals: -92. - - self assert: '1796exportFixes-tkMX' asWideString asSignedInteger equals: 1796. - self assert: 'donald' asWideString asSignedInteger isNil. - self assert: 'abc234def567' asWideString asSignedInteger equals: 234. - self assert: '-94' asWideString asSignedInteger equals: -94. - self assert: 'foo-bar-92' asWideString asSignedInteger equals: -92. - - self assert: '1796exportFixes-tkMX' asWideString asUnsignedInteger equals: 1796. - self assert: 'donald' asWideString asUnsignedInteger isNil. - self assert: 'abc234def567' asWideString asUnsignedInteger equals: 234. - self assert: '-94' asWideString asUnsignedInteger equals: 94. - self assert: 'foo-bar-92' asWideString asUnsignedInteger equals: 92 -] - { #category : 'testing' } WideStringTest >> testAtPut [ "Non regression test for http://bugs.squeak.org/view.php?id=6998" From 813dbe2aae0d3ed033c2b90a32c4cb3c431477e1 Mon Sep 17 00:00:00 2001 From: jordanmontt Date: Fri, 18 Oct 2024 15:44:11 +0200 Subject: [PATCH 3/9] Replaced senders asInteger -> extractIntegerPart --- .../MetacelloSemanticVersionNumber.class.st | 28 ++++++++----------- src/Ombu/OmBlock.class.st | 9 +++--- src/Ombu/OmBlockFileStore.class.st | 10 +++---- src/Ombu/OmFileStore.class.st | 11 ++++---- src/Ombu/OmMemoryStore.class.st | 6 ++-- 5 files changed, 31 insertions(+), 33 deletions(-) diff --git a/src/Metacello-Core/MetacelloSemanticVersionNumber.class.st b/src/Metacello-Core/MetacelloSemanticVersionNumber.class.st index 364053f1737..c4143f237a0 100644 --- a/src/Metacello-Core/MetacelloSemanticVersionNumber.class.st +++ b/src/Metacello-Core/MetacelloSemanticVersionNumber.class.st @@ -199,22 +199,18 @@ MetacelloSemanticVersionNumber class >> fromString: aString forPattern: forPatte { #category : 'private' } MetacelloSemanticVersionNumber class >> integerFromString: aString [ - aString - detect: [ :char | char isDigit not ] - ifNone: [ - | integer | - integer := aString asInteger. - ((aString at: 1) = $0 and: [ aString size > 1 ]) - ifTrue: [ - self - error: - 'invalid version number: normal version component must not have leading 0s' - , aString asString ]. - ^ integer ]. - self - error: - 'invalid version number: normal version component must be integer ' - , aString asString + + aString detect: [ :char | char isDigit not ] ifNone: [ + | integer | + integer := aString extractIntegerPart. + ((aString at: 1) = $0 and: [ aString size > 1 ]) ifTrue: [ + self error: + 'invalid version number: normal version component must not have leading 0s' + , aString asString ]. + ^ integer ]. + self error: + 'invalid version number: normal version component must be integer ' + , aString asString ] { #category : 'private' } diff --git a/src/Ombu/OmBlock.class.st b/src/Ombu/OmBlock.class.st index b4a3454abff..95dfd8d3b0d 100644 --- a/src/Ombu/OmBlock.class.st +++ b/src/Ombu/OmBlock.class.st @@ -33,11 +33,11 @@ OmBlock >> atLocalName: aString ifPresent: presentBlockClosure ifAbsent: absentB | index | self checkIfMustRefreshBlock. - index := aString asInteger - self firstLocalNameAsInteger + 1. + index := aString extractIntegerPart - self firstLocalNameAsInteger + 1. ^ index > positions size - ifTrue: [ absentBlockClosure value ] - ifFalse: [presentBlockClosure value: (positions at: index) ] + ifTrue: [ absentBlockClosure value ] + ifFalse: [ presentBlockClosure value: (positions at: index) ] ] { #category : 'refreshing' } @@ -58,7 +58,8 @@ OmBlock >> firstEntryReference [ { #category : 'accessing' } OmBlock >> firstLocalNameAsInteger [ - ^ self firstEntryReference localName asInteger + + ^ self firstEntryReference localName extractIntegerPart ] { #category : 'initialization' } diff --git a/src/Ombu/OmBlockFileStore.class.st b/src/Ombu/OmBlockFileStore.class.st index 1c6c792903d..81502c7dd66 100644 --- a/src/Ombu/OmBlockFileStore.class.st +++ b/src/Ombu/OmBlockFileStore.class.st @@ -52,11 +52,11 @@ OmBlockFileStore >> initialize [ { #category : 'accessing' } OmBlockFileStore >> readEntryForLocalName: aString ifPresent: presentBlockClosure ifAbsent: absentBlockClosure [ - ^ (self blockForLocalNameAsInteger: aString asInteger) - atLocalName: aString - ifPresent: [ :position | - presentBlockClosure value: (self nextEntryFromPosition: position) ] - ifAbsent: absentBlockClosure + ^ (self blockForLocalNameAsInteger: aString extractIntegerPart) + atLocalName: aString + ifPresent: [ :position | + presentBlockClosure value: (self nextEntryFromPosition: position) ] + ifAbsent: absentBlockClosure ] { #category : 'refreshing' } diff --git a/src/Ombu/OmFileStore.class.st b/src/Ombu/OmFileStore.class.st index ff3665590dd..5256fc86674 100644 --- a/src/Ombu/OmFileStore.class.st +++ b/src/Ombu/OmFileStore.class.st @@ -415,16 +415,17 @@ OmFileStore >> refreshEntryPositionsByLocalNameStartingAt: firstStreamPosition s (+ would need special care of WideStrings)" | localNameAsInteger | - localNameAsInteger := initialLocalName asInteger. + localNameAsInteger := initialLocalName extractIntegerPart. - self readEntriesWith: [:readStream | + self readEntriesWith: [ :readStream | readStream position: firstStreamPosition. self newEntryReader stream: readStream; entryPositionsDo: [ :entryPosition | - entryPositionsByLocalName at: localNameAsInteger asString put: entryPosition. - localNameAsInteger := localNameAsInteger + 1 ]. - ] + entryPositionsByLocalName + at: localNameAsInteger asString + put: entryPosition. + localNameAsInteger := localNameAsInteger + 1 ] ] ] { #category : 'accessing' } diff --git a/src/Ombu/OmMemoryStore.class.st b/src/Ombu/OmMemoryStore.class.st index 38a7283ad48..8e3044a1b65 100644 --- a/src/Ombu/OmMemoryStore.class.st +++ b/src/Ombu/OmMemoryStore.class.st @@ -56,12 +56,12 @@ OmMemoryStore >> entriesDo: aBlockClosure [ OmMemoryStore >> entryFor: aReference ifPresent: presentBlockClosure ifAbsent: absentBlockClosure [ | entry | - (aReference isNull or: [ aReference globalName ~= self globalName]) + (aReference isNull or: [ aReference globalName ~= self globalName ]) ifTrue: [ ^ absentBlockClosure value ]. entry := entries - at: aReference localName asInteger - ifAbsent: [ ^ absentBlockClosure value ]. + at: aReference localName extractIntegerPart + ifAbsent: [ ^ absentBlockClosure value ]. ^ presentBlockClosure cull: entry ] From 7863e2c331c624a013ee49df623ffd281260d1e6 Mon Sep 17 00:00:00 2001 From: jordanmontt Date: Fri, 18 Oct 2024 15:46:13 +0200 Subject: [PATCH 4/9] Replaced senders asInteger -> extractIntegerPart --- src/Reflectivity/Context.extension.st | 2 +- src/System-Support/SystemVersion.class.st | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Reflectivity/Context.extension.st b/src/Reflectivity/Context.extension.st index 039b26089db..fa512c0d827 100644 --- a/src/Reflectivity/Context.extension.st +++ b/src/Reflectivity/Context.extension.st @@ -55,7 +55,7 @@ Context >> currentBytecode: currentBytecode equalsToNewBytecode: newBytecode wit ifFalse: [ false ] ifTrue: [ | currentJumpPc newJumpPc currentJumpBytecode newJumpBytecode | - currentJumpPc := (currentSplitDescription at: 2) asInteger. + currentJumpPc := (currentSplitDescription at: 2) extractIntegerPart. newJumpPc := (newSplitDescription at: 2) asInteger. currentJumpBytecode := currentSymbolicBytecodes detect: [ :csb | diff --git a/src/System-Support/SystemVersion.class.st b/src/System-Support/SystemVersion.class.st index 543ad6c48cc..5faeab21819 100644 --- a/src/System-Support/SystemVersion.class.st +++ b/src/System-Support/SystemVersion.class.st @@ -122,7 +122,7 @@ SystemVersion class >> useCurrent: aSystemVersion during: aBlock [ { #category : 'accessing - properties' } SystemVersion >> build [ - ^ build asInteger + ^ build extractIntegerPart ] { #category : 'accessing - properties' } @@ -252,7 +252,7 @@ SystemVersion >> initialize [ SystemVersion >> major [ "Answer the major number of a version. 1 in '1.2'" - ^ major asInteger + ^ major extractIntegerPart ] { #category : 'accessing - properties' } @@ -300,7 +300,7 @@ SystemVersion >> majorMinorVersion [ SystemVersion >> minor [ "Answer the minor number of a version. 2 in '1.2'" - ^ minor asInteger + ^ minor extractIntegerPart ] { #category : 'accessing - properties' } @@ -313,7 +313,7 @@ SystemVersion >> minor: anInteger [ { #category : 'accessing' } SystemVersion >> patch [ - ^ patch asInteger + ^ patch extractIntegerPart ] { #category : 'accessing' } From 25a4ff981113da07e7273ba4ff1451b12df52f18 Mon Sep 17 00:00:00 2001 From: jordanmontt Date: Fri, 18 Oct 2024 15:50:00 +0200 Subject: [PATCH 5/9] Replaced senders asInteger -> extractIntegerPart --- src/System-Time/DateAndTime.class.st | 14 +++++++------- src/System-Time/DateParser.class.st | 2 +- src/System-Time/Duration.class.st | 10 +++++----- .../FFICalloutMethodBuilderTestRequestor.class.st | 2 +- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/System-Time/DateAndTime.class.st b/src/System-Time/DateAndTime.class.st index 2f5d6e0f726..10bd3724a0b 100644 --- a/src/System-Time/DateAndTime.class.st +++ b/src/System-Time/DateAndTime.class.st @@ -173,22 +173,22 @@ DateAndTime class >> fuzzyReadFrom: aStream [ aStream peek = $- ifTrue: [ aStream next. bc := -1] ifFalse: [bc := 1]. - year := (aStream upTo: $-) asInteger * bc. - month := (aStream upTo: $-) asInteger ifNil: [1]. - day := (aStream upTo: $T) asInteger ifNil: [1]. - hour := (aStream upTo: $:) asInteger ifNil: [0]. + year := (aStream upTo: $-) extractIntegerPart * bc. + month := (aStream upTo: $-) extractIntegerPart ifNil: [1]. + day := (aStream upTo: $T) extractIntegerPart ifNil: [1]. + hour := (aStream upTo: $:) extractIntegerPart ifNil: [0]. buffer := '00:' copy. ch := nil. minute := buffer writeStream. [ aStream atEnd | (ch = $:) | (ch = $+) | (ch = $-) ] whileFalse: [ ch := minute nextPut: aStream next. ]. (ch isNil or: [ch isDigit]) ifTrue: [ ch := $: ]. - minute := (buffer readStream upTo: ch) asInteger. + minute := (buffer readStream upTo: ch) extractIntegerPart. buffer := '00.' copy. second := buffer writeStream. [ aStream atEnd | (ch = $.) | (ch = $+) | (ch = $-) ] whileFalse: [ ch := second nextPut: aStream next. ]. (ch isNil or: [ch isDigit]) ifTrue: [ ch := $. ]. - second := (buffer readStream upTo: ch) asInteger. + second := (buffer readStream upTo: ch) extractIntegerPart. buffer := '000000000' copy. (ch = $.) ifTrue: [ nanos := buffer writeStream. @@ -197,7 +197,7 @@ DateAndTime class >> fuzzyReadFrom: aStream [ (ch isNil or: [ch isDigit]) ifTrue: [ ch := $+ ]. ]. - nanos := buffer asInteger. + nanos := buffer extractIntegerPart. aStream atEnd ifTrue: [ offset := Duration zero ] ifFalse: [ch := aStream next. diff --git a/src/System-Time/DateParser.class.st b/src/System-Time/DateParser.class.st index c80b39c1af4..bf9cf2c4a55 100644 --- a/src/System-Time/DateParser.class.st +++ b/src/System-Time/DateParser.class.st @@ -156,7 +156,7 @@ DateParser >> parse: aTimeUnitName [ DateParser >> parse: timeUnitName expectedSize: anInteger [ | extractedString result | extractedString := inputStream next: anInteger. - result := extractedString asInteger. + result := extractedString extractIntegerPart. (result isNil or: [ extractedString size ~= anInteger ]) ifTrue: [ DateError signal: ' Expect a two digit ', timeUnitName, ', got ', extractedString ]. ^ result diff --git a/src/System-Time/Duration.class.st b/src/System-Time/Duration.class.st index aeb778a97ff..0fc7fb9dbf7 100644 --- a/src/System-Time/Duration.class.st +++ b/src/System-Time/Duration.class.st @@ -100,10 +100,10 @@ Duration class >> readFrom: aStream [ | sign days hours minutes seconds nanos nanosBuffer | sign := (aStream peekFor: $-) ifTrue: [-1] ifFalse: [1]. - days := (aStream upTo: $:) asInteger sign: sign. - hours := (aStream upTo: $:) asInteger sign: sign. - minutes := (aStream upTo: $:) asInteger sign: sign. - seconds := (aStream upTo: $.) asInteger sign: sign. + days := (aStream upTo: $:) extractIntegerPart sign: sign. + hours := (aStream upTo: $:) extractIntegerPart sign: sign. + minutes := (aStream upTo: $:) extractIntegerPart sign: sign. + seconds := (aStream upTo: $.) extractIntegerPart sign: sign. nanosBuffer := '000000000' copy. nanos := nanosBuffer writeStream. [aStream atEnd not and: [aStream peek isDigit]] @@ -114,7 +114,7 @@ Duration class >> readFrom: aStream [ hours: hours minutes: minutes seconds: seconds - nanoSeconds: (nanosBuffer asInteger sign: sign) + nanoSeconds: (nanosBuffer extractIntegerPart sign: sign) ] { #category : 'instance creation simple' } diff --git a/src/UnifiedFFI-Tests/FFICalloutMethodBuilderTestRequestor.class.st b/src/UnifiedFFI-Tests/FFICalloutMethodBuilderTestRequestor.class.st index 8aab5acf8db..c966b7a405c 100644 --- a/src/UnifiedFFI-Tests/FFICalloutMethodBuilderTestRequestor.class.st +++ b/src/UnifiedFFI-Tests/FFICalloutMethodBuilderTestRequestor.class.st @@ -16,6 +16,6 @@ FFICalloutMethodBuilderTestRequestor >> loaderFromMethodArgsNamed: argName [ ifTrue: [ ^ FFIMethodArgument new argName: argName; - index: (argName allButFirst: 3) asInteger ]. + index: (argName allButFirst: 3) extractIntegerPart ]. ^ nil ] From 1e7bd8f39cf95e8255e69d3afa84399875890a1c Mon Sep 17 00:00:00 2001 From: jordanmontt Date: Fri, 18 Oct 2024 15:59:04 +0200 Subject: [PATCH 6/9] Moved deprecated method to the deprecated package --- src/Collections-Strings/String.class.st | 12 ------------ src/Deprecated13/String.extension.st | 13 +++++++++++++ 2 files changed, 13 insertions(+), 12 deletions(-) create mode 100644 src/Deprecated13/String.extension.st diff --git a/src/Collections-Strings/String.class.st b/src/Collections-Strings/String.class.st index a9c40e9f9ea..4e2bc12f22d 100644 --- a/src/Collections-Strings/String.class.st +++ b/src/Collections-Strings/String.class.st @@ -744,18 +744,6 @@ String >> asPluralBasedOn: aNumberOrCollection [ ifFalse: [self, 's'] ] -{ #category : 'converting' } -String >> asSignedInteger [ - "Returns the first signed integer it can find or nil." - - self - deprecated: - 'Use #asInteger to convert to a valid integer. If you want to extract the integer part, use #extractIntegerPart' - transformWith: - '`@receiver asSignedInteger' -> '`@receiver extractIntegerPart'. - ^ self extractIntegerPart -] - { #category : 'converting' } String >> asString [ "Answer this string." diff --git a/src/Deprecated13/String.extension.st b/src/Deprecated13/String.extension.st new file mode 100644 index 00000000000..6d891325d43 --- /dev/null +++ b/src/Deprecated13/String.extension.st @@ -0,0 +1,13 @@ +Extension { #name : 'String' } + +{ #category : '*Deprecated13' } +String >> asSignedInteger [ + "Returns the first signed integer it can find or nil." + + self + deprecated: + 'Use #asInteger to convert to a valid integer. If you want to extract the integer part, use #extractIntegerPart' + transformWith: + '`@receiver asSignedInteger' -> '`@receiver extractIntegerPart'. + ^ self extractIntegerPart +] From 97d4e455bac6f545ee3177718e44e8045b94372c Mon Sep 17 00:00:00 2001 From: jordanmontt Date: Sat, 19 Oct 2024 12:20:51 +0200 Subject: [PATCH 7/9] Improved error message when failin to parse. --- src/Collections-Strings/String.class.st | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Collections-Strings/String.class.st b/src/Collections-Strings/String.class.st index 4e2bc12f22d..4e75687a544 100644 --- a/src/Collections-Strings/String.class.st +++ b/src/Collections-Strings/String.class.st @@ -704,7 +704,7 @@ String >> asInteger [ "'1.234' asInteger >>> 1" (NumberParser isNumber: self) ifFalse: [ - self error: 'The string is not a valid integer' ]. + self error: 'The string ', self surroundedBySingleQuotes , ' is not a valid integer' ]. ^ NumberParser parse: self ] From b3f4ac5bf67c4d6ddae72d01110bcb188570ea79 Mon Sep 17 00:00:00 2001 From: jordanmontt Date: Sun, 20 Oct 2024 16:15:49 +0200 Subject: [PATCH 8/9] Improved method comment --- src/Collections-Strings/String.class.st | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Collections-Strings/String.class.st b/src/Collections-Strings/String.class.st index 4e75687a544..fea6d0f0039 100644 --- a/src/Collections-Strings/String.class.st +++ b/src/Collections-Strings/String.class.st @@ -1374,6 +1374,14 @@ String >> expandMacrosWithArguments: anArray [ { #category : 'converting' } String >> extractIntegerPart [ "Returns the first signed integer it can find or nil." + + "'1' extractIntegerPart >>> 1" + "'-1' extractIntegerPart >>> -1" + "'10qwe' extractIntegerPart >>> 10" + "'a10q' extractIntegerPart >>> 10" + "'a10q22' extractIntegerPart >>> 10" + "'1.234' extractIntegerPart >>> 1" + "'a' extractIntegerPart >>> nil" | start stream | start := self findFirst: [ :char | char isDigit ]. From e57f85609b5bc0795fb237e9221ceaf019a25726 Mon Sep 17 00:00:00 2001 From: jordanmontt Date: Mon, 21 Oct 2024 17:11:31 +0200 Subject: [PATCH 9/9] Added '123 4' asInteger test case as suggested by astares --- src/Collections-Strings-Tests/StringTest.class.st | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Collections-Strings-Tests/StringTest.class.st b/src/Collections-Strings-Tests/StringTest.class.st index 33c480eca0a..93f84be4377 100644 --- a/src/Collections-Strings-Tests/StringTest.class.st +++ b/src/Collections-Strings-Tests/StringTest.class.st @@ -450,6 +450,7 @@ StringTest >> testAsInteger [ self should: [ '1796exportFixes-tkMX' asInteger ] raise: Error. self should: [ 'donald' asInteger ] raise: Error. self should: [ 'abc234def567' asInteger ] raise: Error. + self should: [ '123 4' asInteger ] raise: Error. self assert: '-94' asInteger equals: -94. self assert: '9432' asInteger equals: 9432 ]