If you mean that it replaces spaces with + in the URL it submits, that is correct behavior.
If you mean that the recipient sees + instead of spaces in the received message, that indicates double URL-encoding.
visit_url( string ) is supposed to automatically url-encode its argument. If you have already url-encoded it, you have to call the 3-argument version of visit_url and tell it that: visit_url( url, true, true ); (the second argument says to use POST, which your probably want).
Now, since visit_url already url-encodes your argument, it's not clear why it's not working right for you without those calls - although if you are putting in arbitrary strings - which might include the "&" character, for example, you should do it that way. I'm unclear on what you mean by "Why would the number not show up in the text box either way?" Which text box? At the recipient, in the browser, or are you making a relay override of some sort?