How can I convert a char that has this info in it "312,000" to a double?
I know I can use atof but it doesnt work with the comma.. is there any way to remove the comma.. or to use atof when theres non numeric values in the char?


8 Years
Discussion Span
Last Post by Narue

A char cannot hold "312,000". You are probably thinking about
an array of chars, or a string. Use something like this :

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

string deleteChar(string str, char charDelete = ','){
	size_t pos = str.find(charDelete);
	if(pos == string::npos) return str;
	str.erase( pos, 1);
	return str;
size_t convertFromString(string strNum){
	stringstream converter;
	size_t value = 0;
	converter << strNum; //insert string into our stream
	converter >> value; //extract data into our variable
	//check if conversion was good
	if(converter.fail() ) throw std::exception(" Error converting " );
	return value;
size_t myConvert(string strNum){

	while(strNum.find(',') != string::npos) //while comma is there
		strNum = deleteChar(strNum); //delete the comma

	size_t value = convertFromString(strNum); //convert string to size_t

	return value;
int main ()
	size_t value = myConvert("1,000,000");
	cout << value * 2 << endl;

	return 0;

>Or loop through the 'char' and use the num = (num * 10) + char process.
Nine times out of ten, this algorithm breaks on edge cases. Unless it's a homework problem, such a manual process isn't recommended when there are better alternatives like std::stringstream.

>Use something like this
Manually removing the commas smells kludgy. You can easily imbue the stringstream with a suitable locale and all of that work will be done by the library:

#include <iostream>
#include <locale>
#include <sstream>
#include <string>
#include <typeinfo>

template <typename T>
T parse ( const std::string& s, std::locale loc = std::locale ( "C" ) )
  std::istringstream in ( s );
  T result;

  in.imbue ( loc );

  if ( !( in>> result ) || !in.eof() ) {
    std::ostringstream err;

    err<<"Could not convert to type "<< typeid ( T ).name()
       <<" at "<< in.rdbuf();

    throw std::invalid_argument ( err.str() );

  return result;

int main()
  try {
    const char *p = "312,000";

    // This is the important part. The "C" locale expects
    // no digit separators, but the "" locale uses local
    // area conventions (commas in my case)
    double d = parse<double> ( p, std::locale ( "" ) );

    std::cout<<"The value is "<< d <<'\n';
  } catch ( std::invalid_argument& ex ) {
    std::cout<<"Invalid floating-point value: "<< ex.what() <<'\n';
This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.