<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Inserting commas to numbers</title>
		<link>http://www.allegro.cc/forums/view/601301</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Thu, 20 Aug 2009 19:16:05 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>So a quick Google search didn&#39;t turn up anything useful in adding commas to numbers (like &quot;1000&quot;) in standard C or C++ (preferably C++), so I wrote my own.  Can I get some feedback on the attached source as to how I can/should do it better?  I&#39;ve also wrapped it in &lt;code&gt;&lt;/code&gt; tags below since it&#39;s so short.</p><p>Using <span class="source-code">std::stringstream</span> is probably using a hammer to drive a thumbtack, but I&#39;ve been having problems wrapping my mind around simpler solutions.</p><div class="source-code"><div class="toolbar"><span class="name">commas_to_numbers.cpp</span><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#include &lt;string&gt;</span>
<span class="number">  2</span><span class="p">#include &lt;sstream&gt;</span>
<span class="number">  3</span><span class="p">#include &lt;iostream&gt;</span>
<span class="number">  4</span>
<span class="number">  5</span>
<span class="number">  6</span><span class="c">/* Step 1: 'value' needs to be converted (back) to a string.</span>
<span class="number">  7</span><span class="c"> * Step 2: Determine how many commas need to be added based on the length of</span>
<span class="number">  8</span><span class="c"> *         the generated string:</span>
<span class="number">  9</span><span class="c"> *            "0".."999" contains 1..3 characters: add 0 commas</span>
<span class="number"> 10</span><span class="c"> *            "1000".."999999" contains 4..6 characters: add 1 comma</span>
<span class="number"> 11</span><span class="c"> *            "1000000".."999999999" contains 7..9 characters: add 2 commas</span>
<span class="number"> 12</span><span class="c"> *         So ((num_chars-1) / 3) gives the number of commas to add.</span>
<span class="number"> 13</span><span class="c"> * Step 3: Push commas into the final string array.</span>
<span class="number"> 14</span><span class="c"> */</span>
<span class="number"> 15</span>std::string add_commas<span class="k2">(</span><span class="k1">const</span> <span class="k1">int</span><span class="k3">&amp;</span> value<span class="k2">)</span>
<span class="number"> 16</span><span class="k2">{</span>
<span class="number"> 17</span>   std::stringstream ss<span class="k2">;</span>
<span class="number"> 18</span>   ss.str<span class="k2">(</span><span class="s">""</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// Clear the buffer</span>
<span class="number"> 19</span>
<span class="number"> 20</span>   <span class="c">/* Negative sign will throw off calculation due to the extra '-' at the</span>
<span class="number"> 21</span><span class="c">    * front.  Remove it until the very end.</span>
<span class="number"> 22</span><span class="c">    */</span>
<span class="number"> 23</span>   <span class="k1">if</span> <span class="k2">(</span>value <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span>
<span class="number"> 24</span>      ss <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="k3">-</span>value<span class="k2">;</span>
<span class="number"> 25</span>   <span class="k1">else</span>
<span class="number"> 26</span>      ss <span class="k3">&lt;</span><span class="k3">&lt;</span> value<span class="k2">;</span>
<span class="number"> 27</span>
<span class="number"> 28</span>   std::string result<span class="k2">(</span>ss.str<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 29</span>
<span class="number"> 30</span>   <span class="k1">unsigned</span> num_chars <span class="k3">=</span> result.length<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 31</span>   <span class="k1">unsigned</span> num_commas <span class="k3">=</span> <span class="k2">(</span>num_chars <span class="k3">-</span> <span class="n">1</span><span class="k2">)</span> <span class="k3">/</span> <span class="n">3</span><span class="k2">;</span>
<span class="number"> 32</span>
<span class="number"> 33</span>   <span class="k1">for</span> <span class="k2">(</span><span class="k1">unsigned</span> i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> i <span class="k3">&lt;</span> num_commas<span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>i<span class="k2">)</span>
<span class="number"> 34</span>   <span class="k2">{</span>
<span class="number"> 35</span>      result.insert<span class="k2">(</span><span class="k2">(</span>num_chars <span class="k3">-</span> <span class="n">3</span><span class="k2">)</span> <span class="k3">-</span> <span class="n">3</span> <span class="k3">*</span> i, <span class="s">","</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 36</span>   <span class="k2">}</span>
<span class="number"> 37</span>
<span class="number"> 38</span>   <span class="c">// Need to re-insert leading '-' sign?</span>
<span class="number"> 39</span>   <span class="k1">if</span> <span class="k2">(</span>value <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span>
<span class="number"> 40</span>      result.insert<span class="k2">(</span><span class="n">0</span>, <span class="s">"-"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 41</span>
<span class="number"> 42</span>   <span class="k1">return</span> result<span class="k2">;</span>
<span class="number"> 43</span><span class="k2">}</span>
<span class="number"> 44</span>
<span class="number"> 45</span>
<span class="number"> 46</span><span class="k1">void</span> show_usage<span class="k2">(</span><span class="k1">char</span><span class="k3">*</span> filename<span class="k2">)</span>
<span class="number"> 47</span><span class="k2">{</span>
<span class="number"> 48</span>   std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> filename <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">": Add commas to numbers &gt;= 1000.\n"</span>
<span class="number"> 49</span>             <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"  Example: Entering ``1000'' results in ``1,000'' and\n"</span>
<span class="number"> 50</span>             <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"           ``1234567'' results in ``1,234,567'', while\n"</span>
<span class="number"> 51</span>             <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"           ``0'' through ``999'' remain ``0'' through\n"</span>
<span class="number"> 52</span>             <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"           ``999'', respectively.\n"</span>
<span class="number"> 53</span>             <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl
<span class="number"> 54</span>             <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"  Note: There is no error-checking, so if you pass in a\n"</span>
<span class="number"> 55</span>             <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"        non-number value, you'll crash the program.  You\n"</span>
<span class="number"> 56</span>             <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"        have been warned.\n"</span>
<span class="number"> 57</span>             <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 58</span><span class="k2">}</span>
<span class="number"> 59</span>
<span class="number"> 60</span>
<span class="number"> 61</span><span class="k1">int</span> main<span class="k2">(</span><span class="k1">int</span> argc, <span class="k1">char</span><span class="k3">*</span> argv<span class="k2">[</span><span class="k2">]</span><span class="k2">)</span>
<span class="number"> 62</span><span class="k2">{</span>
<span class="number"> 63</span>   <span class="k1">if</span> <span class="k2">(</span>argc <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span>
<span class="number"> 64</span>   <span class="k2">{</span>
<span class="number"> 65</span>      show_usage<span class="k2">(</span>argv<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 66</span>      <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 67</span>   <span class="k2">}</span>
<span class="number"> 68</span>
<span class="number"> 69</span>   <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> i <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span> i <span class="k3">&lt;</span> argc<span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>i<span class="k2">)</span>
<span class="number"> 70</span>   <span class="k2">{</span>
<span class="number"> 71</span>      std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"\t#"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> i <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">": "</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> add_commas<span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_54.html" target="_blank">atoi</a><span class="k2">(</span>argv<span class="k2">[</span>i<span class="k2">]</span><span class="k2">)</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 72</span>   <span class="k2">}</span>
<span class="number"> 73</span>
<span class="number"> 74</span>   <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 75</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (OnlineCop)</author>
		<pubDate>Wed, 19 Aug 2009 05:22:47 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><a href="http://c-faq.com/stdio/commaprint.html">http://c-faq.com/stdio/commaprint.html</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (LennyLen)</author>
		<pubDate>Wed, 19 Aug 2009 05:28:07 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Untested, and probably some off-by-one errors:
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="k1">char</span> <span class="k3">*</span>number_format<span class="k2">(</span><span class="k1">int</span> n<span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>  <span class="k1">int</span> i <span class="k3">=</span> <span class="n">0</span>, len <span class="k3">=</span> <span class="n">4</span> <span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_543.html" target="_blank">log10</a><span class="k2">(</span>n<span class="k2">)</span> <span class="k3">/</span> <span class="n">3</span> <span class="k3">+</span> <span class="n">2</span><span class="k2">;</span>
<span class="number">  4</span>  <span class="k1">char</span> <span class="k3">*</span>c <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_551.html" target="_blank">malloc</a><span class="k2">(</span>len<span class="k2">)</span><span class="k2">;</span>
<span class="number">  5</span>  <span class="k1">char</span> <span class="k3">*</span>p <span class="k3">=</span> c <span class="k3">+</span> len <span class="k3">-</span> <span class="n">1</span><span class="k2">;</span>
<span class="number">  6</span>  <span class="k3">*</span>p-- <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  7</span>
<span class="number">  8</span>  <span class="k1">do</span>
<span class="number">  9</span>  <span class="k2">{</span>
<span class="number"> 10</span>    <span class="k1">if</span> <span class="k2">(</span>i<span class="k3">+</span><span class="k3">+</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">3</span><span class="k2">)</span>
<span class="number"> 11</span>    <span class="k2">{</span>
<span class="number"> 12</span>       <span class="k3">*</span>p-- <span class="k3">=</span> <span class="s">','</span><span class="k2">;</span>
<span class="number"> 13</span>       i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 14</span>    <span class="k2">}</span>
<span class="number"> 15</span>    <span class="k3">*</span>p-- <span class="k3">=</span> <span class="s">'0'</span> <span class="k3">+</span> n % <span class="n">10</span><span class="k2">;</span>
<span class="number"> 16</span>    n <span class="k3">/</span><span class="k3">=</span> <span class="n">10</span><span class="k2">;</span>
<span class="number"> 17</span>  <span class="k2">}</span> <span class="k1">while</span> <span class="k2">(</span>n<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 18</span>
<span class="number"> 19</span>  <span class="k1">return</span> p<span class="k2">;</span>
<span class="number"> 20</span><span class="k2">}</span>
</div></div><p>
Oh, and it&#39;s for positive numbers only.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Matthew Leverton)</author>
		<pubDate>Wed, 19 Aug 2009 05:41:51 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/601301/825896#target">Matthew Leverton</a> said:</div><div class="quote"><p>
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number"> 1</span><span class="k1">char</span> <span class="k3">*</span>number_format<span class="k2">(</span><span class="k1">int</span> n<span class="k2">)</span>
</div></div><p>
Oh, and it&#39;s for positive numbers only.
</p></div></div><p>
Wouldn&#39;t it make sense, then, to change it to:
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number"> 1</span><span class="k1">char</span> <span class="k3">*</span>number_format<span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">int</span> n<span class="k2">)</span>
</div></div><p>
and save yourself the headache of the possibility of the negativity?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (OnlineCop)</author>
		<pubDate>Wed, 19 Aug 2009 08:17:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Here, now it should work fine:
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="k1">char</span> <span class="k3">*</span>number_format<span class="k2">(</span><span class="k1">int</span> n<span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>  <span class="k1">int</span> i <span class="k3">=</span> <span class="k3">-</span><span class="n">1</span>, len, negative <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  4</span>  <span class="k1">char</span> <span class="k3">*</span>c, <span class="k3">*</span>p<span class="k2">;</span>
<span class="number">  5</span>
<span class="number">  6</span>  <span class="k1">if</span> <span class="k2">(</span>n <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span>
<span class="number">  7</span>    len <span class="k3">=</span> <span class="n">2</span><span class="k2">;</span>
<span class="number">  8</span>  <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>n <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span>
<span class="number">  9</span>  <span class="k2">{</span>
<span class="number"> 10</span>    negative <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 11</span>    n <span class="k3">=</span> <span class="k3">-</span>n<span class="k2">;</span>
<span class="number"> 12</span>  len <span class="k3">=</span> <span class="n">4</span> <span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_330.html" target="_blank">floor</a><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_543.html" target="_blank">log10</a><span class="k2">(</span>n<span class="k2">)</span><span class="k2">)</span> <span class="k3">/</span> <span class="n">3</span> <span class="k3">+</span> <span class="n">3</span><span class="k2">;</span>
<span class="number"> 13</span>  <span class="k2">}</span>
<span class="number"> 14</span>  <span class="k1">else</span>
<span class="number"> 15</span>    len <span class="k3">=</span> <span class="n">4</span> <span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_330.html" target="_blank">floor</a><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_543.html" target="_blank">log10</a><span class="k2">(</span>n<span class="k2">)</span><span class="k2">)</span> <span class="k3">/</span> <span class="n">3</span> <span class="k3">+</span> <span class="n">2</span><span class="k2">;</span>
<span class="number"> 16</span>
<span class="number"> 17</span>  c <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_551.html" target="_blank">malloc</a><span class="k2">(</span>len<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 18</span>  p <span class="k3">=</span> c <span class="k3">+</span> len <span class="k3">-</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 19</span>  <span class="k3">*</span>p-- <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 20</span>
<span class="number"> 21</span>  <span class="k1">do</span>
<span class="number"> 22</span>  <span class="k2">{</span>
<span class="number"> 23</span>    <span class="k1">if</span> <span class="k2">(</span><span class="k3">+</span><span class="k3">+</span>i <span class="k3">=</span><span class="k3">=</span> <span class="n">3</span><span class="k2">)</span>
<span class="number"> 24</span>    <span class="k2">{</span>
<span class="number"> 25</span>       <span class="k3">*</span>p-- <span class="k3">=</span> <span class="s">','</span><span class="k2">;</span>
<span class="number"> 26</span>       i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 27</span>    <span class="k2">}</span>
<span class="number"> 28</span>    <span class="k3">*</span>p-- <span class="k3">=</span> <span class="s">'0'</span> <span class="k3">+</span> n % <span class="n">10</span><span class="k2">;</span>
<span class="number"> 29</span>    n <span class="k3">/</span><span class="k3">=</span> <span class="n">10</span><span class="k2">;</span>
<span class="number"> 30</span>  <span class="k2">}</span> <span class="k1">while</span> <span class="k2">(</span>n<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 31</span>
<span class="number"> 32</span>  <span class="k1">if</span> <span class="k2">(</span>negative<span class="k2">)</span> <span class="k3">*</span>p <span class="k3">=</span> <span class="s">'-'</span><span class="k2">;</span>
<span class="number"> 33</span>
<span class="number"> 34</span>  <span class="k1">return</span> c<span class="k2">;</span>
<span class="number"> 35</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Matthew Leverton)</author>
		<pubDate>Wed, 19 Aug 2009 10:06:09 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>That looks incredibly complicated for something this simple... can&#39;t you just do something like:
</p><div class="source-code snippet"><div class="inner"><pre>string format_with_commas<span class="k2">(</span><span class="k1">int</span> number<span class="k2">)</span> <span class="k2">{</span>
  stringstream strs<span class="k2">;</span>
  strs <span class="k3">&lt;</span><span class="k3">&lt;</span> dec <span class="k3">&lt;</span><span class="k3">&lt;</span> number<span class="k2">;</span>
  string str <span class="k3">=</span> strs.str<span class="k2">(</span><span class="k2">)</span>.reverse<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
  string result<span class="k2">;</span>
  <span class="k1">for</span> <span class="k2">(</span>size_t i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> i <span class="k3">&lt;</span> str.length<span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>i<span class="k2">)</span> <span class="k2">{</span>
    <span class="k1">if</span> <span class="k2">(</span>i <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k2">(</span>i % <span class="n">3</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
      result <span class="k3">=</span> <span class="s">","</span> <span class="k3">+</span> result<span class="k2">;</span>
    <span class="k2">}</span>
    result <span class="k3">+</span><span class="k3">=</span> str<span class="k2">[</span>i<span class="k2">]</span><span class="k2">;</span>
  <span class="k2">}</span>
  <span class="k1">return</span> result<span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Tobias Dammers)</author>
		<pubDate>Wed, 19 Aug 2009 10:41:44 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I think locales are meant for that, although it seems very unportable. This compiles and prints the number with commas on Windows XP when compiled with VC 2005, but throws an exception with GCC.</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#include &lt;iostream&gt;</span>
<span class="number">  2</span><span class="p">#include &lt;locale&gt;</span>
<span class="number">  3</span><span class="p">#include &lt;exception&gt;</span>
<span class="number">  4</span><span class="p">#include &lt;sstream&gt;</span>
<span class="number">  5</span>
<span class="number">  6</span><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span>
<span class="number">  7</span><span class="k2">{</span>
<span class="number">  8</span>    <span class="k1">try</span> <span class="k2">{</span>
<span class="number">  9</span>        <span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span> name <span class="k3">=</span> <span class="s">"english-us"</span><span class="k2">;</span>
<span class="number"> 10</span>        std::cout.imbue<span class="k2">(</span>std::locale<span class="k2">(</span>name<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span>        std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">18729873</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">'\n'</span><span class="k2">;</span>
<span class="number"> 12</span>        
<span class="number"> 13</span>        std::stringstream ss<span class="k2">;</span>
<span class="number"> 14</span>        ss.imbue<span class="k2">(</span>std::locale<span class="k2">(</span>name<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span>        ss <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">18729873</span><span class="k2">;</span>
<span class="number"> 16</span>        std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> ss.str<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">'\n'</span><span class="k2">;</span>
<span class="number"> 17</span>
<span class="number"> 18</span>    <span class="k2">}</span> <span class="k1">catch</span> <span class="k2">(</span>std::exception<span class="k3">&amp;</span> e<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 19</span>        std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> e.what<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">'\n'</span><span class="k2">;</span>
<span class="number"> 20</span>    <span class="k2">}</span>
<span class="number"> 21</span><span class="k2">}</span>
</div></div><p>

However, with my native locale, it should use spaces as thousands separators, but it prints a with an accent mark instead.</p><p>Locales are an unknown territory to me but following some online tutorial and dinkumware&#39;s reference, I came up with this that can also format numbers in my locale.</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#include &lt;iostream&gt;</span>
<span class="number">  2</span><span class="p">#include &lt;locale&gt;</span>
<span class="number">  3</span><span class="p">#include &lt;exception&gt;</span>
<span class="number">  4</span><span class="p">#include &lt;sstream&gt;</span>
<span class="number">  5</span>
<span class="number">  6</span><span class="k1">template</span> <span class="k3">&lt;</span><span class="k1">class</span> charT&gt;
<span class="number">  7</span><span class="k1">class</span> num_printer
<span class="number">  8</span>    <span class="k2">:</span> <span class="k1">public</span> std::numpunct<span class="k3">&lt;</span>charT&gt;
<span class="number">  9</span><span class="k2">{</span>
<span class="number"> 10</span>public:
<span class="number"> 11</span>    num_printer<span class="k2">(</span>charT thousands, charT decimals<span class="k2">)</span><span class="k2">:</span> thousands<span class="k2">(</span>thousands<span class="k2">)</span>, decimals<span class="k2">(</span>decimals<span class="k2">)</span> <span class="k2">{</span><span class="k2">}</span>
<span class="number"> 12</span>protected:
<span class="number"> 13</span>    charT do_decimal_point<span class="k2">(</span><span class="k2">)</span> <span class="k1">const</span> <span class="k2">{</span> <span class="k1">return</span> decimals<span class="k2">;</span> <span class="k2">}</span>
<span class="number"> 14</span>    charT do_thousands_sep<span class="k2">(</span><span class="k2">)</span> <span class="k1">const</span> <span class="k2">{</span> <span class="k1">return</span> thousands<span class="k2">;</span> <span class="k2">}</span>
<span class="number"> 15</span>    std::string do_grouping<span class="k2">(</span><span class="k2">)</span> <span class="k1">const</span> <span class="k2">{</span> <span class="k1">return</span> <span class="s">"\3"</span><span class="k2">;</span> <span class="k2">}</span>
<span class="number"> 16</span>private:
<span class="number"> 17</span>    charT thousands, decimals <span class="k2">;</span>
<span class="number"> 18</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 19</span>
<span class="number"> 20</span><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 21</span><span class="k2">{</span>
<span class="number"> 22</span>    <span class="k1">try</span> <span class="k2">{</span>
<span class="number"> 23</span>        std::locale local<span class="k2">(</span>std::locale<span class="k2">(</span><span class="s">""</span><span class="k2">)</span>, <span class="k1">new</span> num_printer<span class="k3">&lt;</span>char&gt;<span class="k2">(</span><span class="s">' '</span>, <span class="s">','</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 24</span>        std::cout.imbue<span class="k2">(</span>local<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 25</span>        std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">9873</span>.<span class="n">56</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">'\n'</span><span class="k2">;</span>
<span class="number"> 26</span>        std::stringstream ss<span class="k2">;</span>
<span class="number"> 27</span>        ss.imbue<span class="k2">(</span>local<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 28</span>        ss <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">18729873</span><span class="k2">;</span>
<span class="number"> 29</span>        std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> ss.str<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">'\n'</span><span class="k2">;</span>
<span class="number"> 30</span>
<span class="number"> 31</span>    <span class="k2">}</span> <span class="k1">catch</span> <span class="k2">(</span>std::exception<span class="k3">&amp;</span> e<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 32</span>        std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> e.what<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">'\n'</span><span class="k2">;</span>
<span class="number"> 33</span>    <span class="k2">}</span>
<span class="number"> 34</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (anonymous)</author>
		<pubDate>Wed, 19 Aug 2009 16:34:04 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Uh well without going in depth to the actual ideal solution, your use of stringstream is frustraitinly awful.  Let me clean it up a bit.
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span>std::string add_commas<span class="k2">(</span><span class="k1">const</span> <span class="k1">int</span><span class="k3">&amp;</span> value<span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>   std::stringstream ss<span class="k2">;</span>
<span class="number">  4</span>
<span class="number">  5</span>   ss <span class="k3">&lt;</span><span class="k3">&lt;</span> value<span class="k2">;</span>
<span class="number">  6</span>
<span class="number">  7</span>   <span class="k1">while</span><span class="k2">(</span>ss.good<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  8</span>
<span class="number">  9</span>      ss.seekp<span class="k2">(</span>ss.ignore<span class="k2">(</span><span class="k2">)</span>.tellg<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 10</span>
<span class="number"> 11</span>      <span class="k1">if</span><span class="k2">(</span><span class="k2">(</span>value <span class="k3">&lt;</span> <span class="n">0</span> ? ss.tellg<span class="k2">(</span><span class="k2">)</span> <span class="k3">&gt;</span> <span class="n">2</span> <span class="k2">:</span> <span class="n">0</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="k2">(</span>ss.tellg<span class="k2">(</span><span class="k2">)</span> % <span class="n">3</span><span class="k2">)</span><span class="k2">)</span>
<span class="number"> 12</span>         ss.put<span class="k2">(</span><span class="s">','</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 13</span>   <span class="k2">}</span>
<span class="number"> 14</span>
<span class="number"> 15</span>   <span class="k1">return</span> ss.str<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span><span class="k2">}</span>
</div></div><p>

There.  That is a good (but untested) way to do it with stringstream.  Also, there is a much quicker way to do something I saw in your code.
</p><div class="source-code snippet"><div class="inner"><pre>   std::string result<span class="k2">(</span>ss.str<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>

   <span class="k1">unsigned</span> num_chars <span class="k3">=</span> result.length<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
You don&#39;t need a string to get the stream length!  Use tellp which stands for &quot;tell me the put pointer.&quot;  The &#39;put pointer&#39; is the character after the last one (aka. the size!)
</p><div class="source-code snippet"><div class="inner"><pre>   <span class="k1">unsigned</span> num_chars <span class="k3">=</span> ss.tellp<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

The second line below is pointless.  A buffer starts out cleared!
</p><div class="source-code snippet"><div class="inner"><pre>   std::stringstream ss<span class="k2">;</span>
   ss.str<span class="k2">(</span><span class="s">""</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// Clear the buffer</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ImLeftFooted)</author>
		<pubDate>Wed, 19 Aug 2009 22:01:30 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><b>sigh</b></p><p>I guess I forgot that I&#39;ve got to wrap my mind around an international market when I program anymore.  I&#39;ve always just grown up thinking that &quot;192,168,100,100&quot; was Bill Gates&#39; annual salary and &quot;192.168.100.100&quot; was a local IP address.  I keep forgetting that commas are different if I change locales.</p><p>Some of you are reusing the <span class="source-code">std::stringstream</span> route... is there a reason that you&#39;re going that direction, like I had done?  The first two posts by LennyLen and Matthew were mostly bare-bones, vanilla C implementations.</p><p><b>EDIT</b>:</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/601301/825956#target">Dustin Dettmer</a> said:</div><div class="quote"><p>
<span class="source-code">   <span class="k1">unsigned</span> num_chars <span class="k3">=</span> ss.tellp<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></span>
</p></div></div><p>
I actually looked up <span class="source-code">tellp<span class="k2">(</span><span class="k2">)</span></span>, and tried it in a test case before posting my results here.  I didn&#39;t use it here because when I used it in my test code, it returned a length of 0 in each case.  Either I did something wrong, or I had input the data wrong somehow (it was right after the </p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number"> 26</span>   ss <span class="k3">&lt;</span><span class="k3">&lt;</span> value<span class="k2">;</span>
</div></div><p>
line, and said that &quot;value&quot; gave a length of 0, while the string length gave an actual length.  It was a kludge, but it worked).</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>The second line below is pointless. A buffer starts out cleared!</p><div class="source-code snippet"><div class="inner"><pre>   std::stringstream ss<span class="k2">;</span>
   ss.str<span class="k2">(</span><span class="s">""</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// Clear the buffer</span>
</pre></div></div><p>
</p></div></div><p>

Yeah, I know.  That&#39;s actually because I use <span class="source-code">std::stringstream</span>&#39;s a lot, and I am used to clearing the stream in this manner; it was left in more from habit than real necessity.  Thanks for the spot, Dustin.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (OnlineCop)</author>
		<pubDate>Wed, 19 Aug 2009 22:06:57 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/601301/825958#target">OnlineCop</a> said:</div><div class="quote"><p>
The first two posts by LennyLen and Matthew were mostly bare-bones, vanilla C implementations.
</p></div></div><p>
Because C fails at string manipulation (especially this one) while C++ owns at this particular string problem.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ImLeftFooted)</author>
		<pubDate>Wed, 19 Aug 2009 22:14:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/601301/825963#target">Dustin Dettmer</a> said:</div><div class="quote"><p>
Because C fails at string manipulation (especially this one) while C++ owns at this particular string problem. 
</p></div></div><p>
How about some C# then?
</p><div class="source-code snippet"><div class="inner"><pre>string FormatWithCommas<span class="k2">(</span><span class="k1">double</span> value<span class="k2">)</span> 
<span class="k2">{</span>
  <span class="k1">return</span> value.ToString<span class="k2">(</span><span class="s">"#,#"</span>, CultureInfo.InvariantCulture<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Tobias Dammers)</author>
		<pubDate>Thu, 20 Aug 2009 01:47:19 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Tobias, explain to me what&#39;s going on there.</p><p>I give you the number &quot;1000&quot; and it returns &quot;1,000&quot;?  And &quot;100000&quot; returns &quot;100,000&quot; or &quot;1000000000&quot; correctly yields &quot;1,000,000,000&quot;, and so forth?</p><p>No hidden strings attached?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (OnlineCop)</author>
		<pubDate>Thu, 20 Aug 2009 02:01:52 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It&#39;s part of .NET&#39;s string formatting routines. <a href="http://msdn.microsoft.com/en-us/library/0c899ak8.aspx#SpecifierTh">Here</a>&#39;s the documentation. It&#39;s a bit counter-intuitive, but the format string &quot;#,#&quot; means format the number normally, and insert the applicable culture&#39;s thousands-separator where appropriate. The applicable culture (the .NET equivalent of a locale) is specified explicitly here as the &quot;Invariant&quot; culture, which more or less means the US-English culture; hence, the thousands-separator is the comma. If you specify a different culture instead, or leave it to .NET to decide for you (which means the local system&#39;s locale is generally selected unless the thread&#39;s culture has been changed somewhere else), the result may differ.<br />If you don&#39;t need to specify the culture for the particular statement, then the following is also equivalent:
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">return</span> String.Format<span class="k2">(</span><span class="s">"{0:#,#}"</span>, value<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
You can even use these in C++, but you&#39;ll have to use MSVC++ and managed C++, which is really an abomination.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Tobias Dammers)</author>
		<pubDate>Thu, 20 Aug 2009 03:04:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Here&#39;s the same for Java (1.5+):
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">return</span> String.format<span class="k2">(</span><span class="s">"%,d"</span>, integerValue<span class="k2">)</span><span class="k2">;</span> <span class="c">// Uses the system (default) locale</span>
<span class="c">// or</span>
<span class="k1">return</span> String.format<span class="k2">(</span>Locale.US, <span class="s">"%,d"</span>, integerValue<span class="k2">)</span><span class="k2">;</span> <span class="c">// Uses the specified locale, US here</span>
</pre></div></div><p>

(<tt>String.format</tt> is a convenience method for <tt><a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/Formatter.html">Formatter</a></tt> class.)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Mika Halttunen)</author>
		<pubDate>Thu, 20 Aug 2009 18:15:44 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>All C and C++ needs are people with experience in more modern frameworks to bring them up to speed. There&#39;s no reason that C# or Java code couldn&#39;t work in C++ too. It just hasn&#39;t been implemented by anyone, or at least not in a freely available and popular library... I&#39;d love to see a rich standard library for both.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (bamccaig)</author>
		<pubDate>Thu, 20 Aug 2009 19:16:05 +0000</pubDate>
	</item>
</rss>
