#include <iostream>
#include <locale>
#include <iomanip>
using namespace std ;
struct comma_facet : public std::numpunct<char>
{ protected: string do_grouping() const { return "\003" ; } };
int main()
{
cout.imbue( locale( cout.getloc(), new comma_facet ) ) ;
cout << fixed << setprecision(2) << showpoint << 123.0 << '\t'
<< 12345.6789 << '\t' << 2000.0/3.0 << '\t' << 1234567.1234 << '\n' ;
}
vijayan121
Posting Virtuoso
1,606 posts since Dec 2006
Reputation Points: 1,159
Solved Threads: 287
#include <iostream>
#include <sstream>
#include <iomanip>
#include <string>
using namespace std;
int main()
{
ostringstream stm ;
stm << fixed << setprecision(2) << showpoint << 12345678.9876 ;
string str = stm.str() ;
int n = str.size() ;
for( int i = n-6 ; i>0 ; i -= 3 ) str.insert( i, 1, ',' ) ;
cout << str << '\n' ;
}
vijayan121
Posting Virtuoso
1,606 posts since Dec 2006
Reputation Points: 1,159
Solved Threads: 287
std C/C++ numerical types don't recognize comma separaters. So, as vijayan has demostrated, you need to find a way to convert the numerical value to a string, then insert the commas and print out the string. There are other ways to do this basic sequence beyond what vijayan has demonstrated, but which way is best for you will depend on what tools you have in your tool chest. To better help us help you we need to know what tools you have available. Do you know about the different types of strings? If so which do you use? Do you know about manipulating arrays/vectors? Do you know about the Standard Template Library, etc. Did you know that main() returns an int in it's standard form? Did you know that you must somehow invoke namespace std when using cout with ith iostream header file? Do you know how to convert numerical values into strings?
Lerner
Nearly a Posting Maven
2,382 posts since Jul 2005
Reputation Points: 739
Solved Threads: 396
All right. First things first.
It should always be int main(), not void main() or plain main(). void main() and plain old main() may work on some compilers, but it's not standard. See vijayan's examples.
If you are going to use the standard iostream header file instead of the (deprecated?) iostream.h header file then you need to inovke namespace std somehow. You can do that by including the line
using namespace std;
right after the list of includes. While this isn't the most sophisticated way to access material in namespace std, it's simple, straightforward, and good enough for most purposes, particularly for beginners. See vijayan's examples.
In the final analysis strings are null terminated char arrays. That means that there must be a null char in the char array just after the last char you want to visualize. This basic type string is often called a C style string because it's the only type string you can use in C. In C++ you can still use that style string, but C++ has a standard string class that can be used that does a lot of the grunt work for you that you have to do on your own if you use C style strings. Technically this string class is part to the Standard Template Library and is sometimes called an STL string or just a C++ string to differentiate it from a C style string. This string class has an embedded C style string in it as a data member and it can be accessed as such when you need to do so. This string class is in namespace std and can be accessed by including the string header file and using some technique to gain access to namespace std. (see vijayan's examples) There is a learning curve in terms of using either type string, but more and more people are recommended beginners in C++ learn how to use the C++ style strings right from the start.
To see how to use the C++ string class, see vijayan's example. If you aren't allowed to use this string class and must use the C style strings, then so be it.
In his second example, vijayan takes advantage of some of the methods available in the string class to insert the commas. In his first example he makes extensive use of features available in C++ that will likely cost you points if you submit such a method to an instructor in a beginners class.
To start with I'd suggest you write a program using standard code that creates a string, assigns the value 12345.67 to it and prints the string to the screen. Post it once you've got it completed and then someone can help you figure out how to insert comma's in it if you don't want to use vijayan's example.
Lerner
Nearly a Posting Maven
2,382 posts since Jul 2005
Reputation Points: 739
Solved Threads: 396
the brute force approach:
#include <iostream>
#include <cmath>
#include <cassert>
using namespace std;
void print_with_comma( double value )
{
assert( value >= 0.0 ) ;
double intp ;
double fracp = modf( value, &intp ) ;
if( fracp >= 0.995 ) { fracp = 0.0 ; intp += 1.0 ; }
int before_decimal = int( intp + 0.5 ) ;
int millions = before_decimal / 1000000 ;
int thousands = ( before_decimal / 1000 ) % 1000 ;
int units = before_decimal % 1000 ;
if( millions > 0 ) cout << millions << ',' ;
if( millions>0 || thousands>0 ) cout << thousands << ',' ;
cout << units << '.' ;
cout.width(2) ;
cout.fill('0') ;
cout << int( fracp*100 + 0.5 ) << '\n' ;
}
vijayan121
Posting Virtuoso
1,606 posts since Dec 2006
Reputation Points: 1,159
Solved Threads: 287
>i'm using the standard header file!!the using namespace std;
Good for you?
Narue
Bad Cop
15,460 posts since Sep 2004
Reputation Points: 6,464
Solved Threads: 1,401
fixed a couple of bugs (brute force version).
#include <iostream>
#include <cmath>
#include <cassert>
#include <iomanip>
using namespace std;
void print_with_comma( double value )
{
assert( value >= 0.0 ) ;
double intp ;
double fracp = modf( value, & intp ) ;
if( fracp >= 0.995 ) { fracp = 0.0 ; intp += 1.0 ; }
int before_decimal = int( intp + 0.5 ) ;
int millions = before_decimal / 1000000 ;
int thousands = ( before_decimal / 1000 ) % 1000 ;
int units = before_decimal % 1000 ;
bool started = millions > 0 ;
if(started) cout << millions << ',' ;
if( started || thousands>0 )
{
cout << setw( started ? 3 : 0 ) << setfill('0') << thousands << ',' ;
started = true ;
}
cout << setw( started ? 3 : 0 ) << setfill('0') << units << '.' ;
cout << setw(2) << setfill('0') << int( fracp*100 + 0.5 ) << '\n' ;
}
vijayan121
Posting Virtuoso
1,606 posts since Dec 2006
Reputation Points: 1,159
Solved Threads: 287