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
|> Enum.reduce("",fn(x,acc) -> acc <> insertarEspacio(x) end)
def insertarEspacio(x) do
x = to_string(x)
if String.match?(x, ~r/[A-Z]/) do
" " <> x
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.
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
"a". This won’t be a problem if you use
String.codepoints/1 like I mentioned above.
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!
Thx. You are right with the uppercase, i was messing with regex because i learn it recently.