Question

I'm trying to get from:

'hello how are you today'

to

'helloHowAreYouToday'

And I thought asCapitalizedPhrase asLegalSelector would do the trick, but it doesn't.

What's the proper way to do this?

EDIT:

I think I should clarify my question; I already have a way to transform a string into a camelCase selector:

|aString aCamelCaseString|
aString := aString findTokens: $ .
aCamelCaseString := aString first.
aString allButFirst do: [:each | aCamelCaseString := aCamelCaseString , each capitalized].

I was just wondering whether Pharo has a standard system method to achieve the same :)

Was it helpful?

Solution

You don't say which version of Pharo you're using, but in the stable 5.0,

'hello world this is a selector' asCamelCase asValidSelector

yields

helloWorldThisIsASelector

To get what I'm using run:

curl get.pharo.org/50+vm | bash 

OTHER TIPS

How about this?

| tokens |
tokens := 'this is a selector' findTokens: Character space.
tokens allButFirst
    inject: tokens first
    into: [:selector :token | selector, token capitalized]

I don't think there's an existing method doing this.

Here's an implementation that solves your problem:

input := 'hello how are you today'.
output := String streamContents: [ :stream |
    | capitalize |
    capitalize := false.
    input do: [ :char |
        char = Character space
            ifTrue: [ capitalize := true ]
            ifFalse: [
                stream nextPut: (capitalize
                    ifTrue: [ char asUppercase ]
                    ifFalse: [ char ]).
                capitalize := false ] ] ].

Edit: note, in comparison to Frank's solution this one is longer but it does not break for empty input and it does not create a new string instance for each step since it streams over the input, which is more efficient (in case you have large strings).

I know this is old but Squeak has a useful implementation (String>>asCamelCase) which basically does this:

(String
    streamContents: [:stream | 'hello world' substrings
            do: [:sub | stream nextPutAll: sub capitalized]]) asLegalSelector
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top