Inserting in a string

Hello, im trying to insert spaces before capitalize letters. For example separarMay(“HelloWorld”) => " Hello World", but instead im getting this => “7210110810811187111114108100” .
This is my aproach:

def separarMay(string) do
string
|> String.to_charlist
|> Enum.reduce("",fn(x,acc) -> acc <> insertarEspacio(x) end)
end

def insertarEspacio(x) do
x = to_string(x)
if String.match?(x, ~r/[A-Z]/) do
" " <> x
else
x
end
end

2 Likes

I’m unsure why converting from binary to char_list then back again for each character, but why not just regex?

iex> Regex.replace(~r/[A-Z]/, "HelloWorld", " \\0")
" Hello World"

Or are you trying to reduce it for some other reason?

For note, this happens because you are converting it to a charlist, meaning a character is an integer, which you convert an integer back to a binary with your to_string call, which gives you the number, not the character.

5 Likes

I think you’ll need to change your accumulator in your reduce (and possibly even write the reduce without Enum.reduce/2). You’ll want to know what the next character is so you know if you need to insert a space or not. Additionally, using a regular expression to check if it is an uppercase is not very performant. I think you’d be better off doing x == String.upcase(x) to check that.

Secondly, your bug which changes everything from letters to numbers is caused by two things. First String.to_charlist/1 returns a list of integers, not binaries (strings). If you want to reduce a string, you should do String.codepoints/1, which will give you a list of strings of a single character (including unicode). Your error comes in when you take an integer like ?a which is 97, and do to_string(97), which produces "97", not "a". This won’t be a problem if you use String.codepoints/1 like I mentioned above.

2 Likes

I was tryng to check the letters one per one, and reach to that solution . I learn about regular expression yesterday so im very beginner and i didnt read that module yet, i will read now . thx!

1 Like

Thx. You are right with the uppercase, i was messing with regex because i learn it recently.

1 Like