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