The rounding bit, at least, is easy--just use STR(CEILING([YourNumber])).
The formatting bit, unfortunately, doesn't look like it has a good answer. STR() removes the formatting that you have, apparently: STR() Function Ignores the Default Date and Number Formatting | Tableau Software
The situation is that Tableau is just pulling whatever number is from the data source it is connecting to, and casting to a string. This forum post talks a bit about it:
So, if you don't want to try and add in commas with an unwieldy calculation, you will need to find a way for the underlying data base to provide the string you want. This could mean Custom SQL if you're talking to a database server, or ensuring that your Excel spreadsheet is formatting the numbers as strings instead, and then using those in your viz. There may be other workarounds, but that's all I've been able to find so far.
Thanks Matt. Since I'm using a custom PostGres SQL already, I'll just have to build the string directly.
Thanks for the help.