-
-
Save jdsharp/852326 to your computer and use it in GitHub Desktop.
// via @DmitryBaranovsk | |
function dirtyCommas(num) { | |
return String(num).replace(/^\d+(?=\.|$)/, function (int) { return int.replace(/(?=(?:\d{3})+$)(?!^)/g, ","); }); | |
} |
@DmitryBaranovskiy Yap, mine avoids negatives and floats to make a pretty print version of the number.
For a single regexp you can do
String(value).replace(/(?=(?:\d{3})+\b)(?!\b\d{3}\b)/g, ",");
passing value as
"hiya -1000.45 and 100 faz, 200foos and 2534230 bars."
would produce
"hiya -1,000.45 and 100 faz, 200foos and 2,534,230 bars."
@jdalton Not that easy, try this:
`"hiya -1000.123123123 and 100 faz, 200foos and 2534230 bars."
Anyway solving it with one regexp is academical task, not very practical. Seems to be some monstrous regexp… or really smart one.
@jdalton Also it will choke on this:
"hiya -1000.45 and 100 faz, 200foos and 253423 bars."
Fix:
String(value).replace(/(?=(?:\d{3})+\b)(?!\b)/g, ",");
Ya but still has a problem with the long decimal values.... I think a solution is close :D
@jdalton I think it even further now. Anyway I give up to solve it with one regexp. :)
Current solution is “good enough”.
ok so the thing I could come up with is:
String(value).replace(/(\.\d+)|(?=(?:\d{3})+\b)(?!\b)/g, function(m, $1) { return $1 || ',' });
It requires passing a function but still just 1 regexp.
I just applied jdalton's 2011.03.04 version to something I'm working on and found that I'll need a way to make it skip over dates. Example confusion: "...vol. 1, no. 4, pp. 4-9, July/August 1,995, concluded that..." (should contain "August 1995", rather than implying the nonsensical "July through August 1st, 995"). Guess I have my work cut out for me.
I've been trying several versions of this and it works great with numbers that are not thousand rounded.
for instance, 1234 goes 1,234.00.
But when I have 4000, I get a 4,0.00, so it basically removes 3 zeros off the thousands portion.
Does anyone have a clue?
@jdsharp, @jdalton, @mathiasbynens Thanks.
@jdalton Your solution wouldn’t work for numbers with a floating point. May be it’s ok. I would rather replace first regexp in my example to
^-?\d+(?=\.|$)
to make it work with negative numbers too.I wonder, could it be done with only one reasonable regexp? ;)