Convert string with thousands (and decimal) separa

2019-02-14 04:09发布

User can enter double into textbox. Number might contain thousands separators. I want to validate user input, before inserting entered number into database.

Is there a C++ function that can convert such input (1,555.99) into double? If there is, can it signal error if input is invalid (I do not want to end up with function similar to atof)?

Something like strtod, but must accept input with thousands separators.

标签: c++ parsing
2条回答
干净又极端
2楼-- · 2019-02-14 04:20

Convert the input to double using a stream that's been imbued with a locale that accepts thousand separators.

#include <locale>
#include <iostream>

int main() {
    double d;

    std::cin.imbue(std::locale(""));
    std::cin >> d;

    std::cout << d;
}

Here I've used the un-named locale, which retrieves locale information from the environment (e.g., from the OS) and sets an appropriate locale (e.g., in my case it's set to something like en_US, which supports commas as thousands separators, so:

Input: 1,234.5
Output: 1234.5

Of course, I could also imbue std::cout with some locale that (for example) uses a different thousands separator, and get output tailored for that locale (but in this case I've used the default "C" locale, which doesn't use thousands separators, just to make the numeric nature of the value obvious).

When you need to do this with something that's already "in" your program as a string, you can use an std::stringstream to do the conversion:

std::string input = "1,234,567.89";

std::istringstream buffer(input);
buffer.imbue(std::locale(""));

double d;
buffer >> d;
查看更多
家丑人穷心不美
3楼-- · 2019-02-14 04:42

A C solution would be to use setlocale & sscanf:

const char *oldL = setlocale(LC_NUMERIC, "de_DE.UTF-8");
double d1 = 1000.43, d2 = 0;
sscanf("1.000,43", "%'lf", &d2);
if ( std::abs(d1-d2) < 0.01 )
  printf("OK \n");
else
  printf("something is wrong! \n");
setlocale(LC_NUMERIC, oldL);
查看更多
登录 后发表回答