получить atof, чтобы продолжить преобразование строки в число после первого недопустимого ch в строке - PullRequest
1 голос
/ 21 сентября 2010

Я хотел бы знать, если есть способ получить atof, продолжайте преобразование в число, даже если в пути есть

, например, допустимые символы, например, допустим, у меня есть строка "444-3-333 "Я хочу преобразовать его в двойное число a = 4443333 (и сохранить строку такой, какой она была), счастливой получить любые предложения или альтернативный способ

спасибо!

Ответы [ 4 ]

3 голосов
/ 21 сентября 2010

Я не могу взять кредит на это решение, хотя оно хорошее, см. этот ТАК.Для тех, кому лень пропустить, автор рекомендует использовать локаль для обработки всех нечисловых цифр как пробела.Это может быть излишним для вашего решения, но идея легко адаптируется.Вместо всего нечислового, вы можете просто использовать «-» в качестве пробела.Вот его код, а не мой.Пожалуйста, если вам это нравится, дайте ему ответ.

struct digits_only: std::ctype<char> 
{
    digits_only(): std::ctype<char>(get_table()) {}

    static std::ctype_base::mask const* get_table()
    {
        static std::vector<std::ctype_base::mask> 
            rc(std::ctype<char>::table_size,std::ctype_base::space);

        std::fill(&rc['0'], &rc['9'], std::ctype_base::digit);
        return &rc[0];
    }
};

bool in_range(int lower, int upper, std::string const &input) { 
    std::istringstream buffer(input);
    buffer.imbue(std::locale(std::locale(), new digits_only()));

    int n;

    while (buffer>>n)
        if (n < lower || upper < n)
            return false;
    return true;
}

Затем просто удалите пробел и передайте строку atof.

1 голос
/ 21 сентября 2010

Обе нижеследующие цифры для меня вычеркнуть

bool no_digit(char ch) {return !std::isdigit(ch);}

std::string read_number(const std::string& input)
{
    std::string result;
    std::remove_copy_if( input.begin()
                       , input.end()
                       , std::back_inserter(result)
                       , &no_digit);
    return result;
}

std::string read_number(std::istream& is)
{
    std::string result;
    for(;;) {
        while(is.good() && !std::isdigit(is.peek()))
            is.get();
        if(!is.good())
            return result;
        result += is.get();
    }
    assert(false);
}

Затем вы можете прочитать число, используя потоки строк:

std::istringstream iss(read_number("444-3-3-33");
int i;
if( !(iss>>i) ) throw "something went wrong!";
std::cout << i << '\n';
0 голосов
/ 21 сентября 2010

скопируйте «номер строки» в локальный буфер (a std::string), затем удалите принятые символы из числа (сжимая строку, чтобы не оставить пробел, используя, таким образом, std::string.replace), затем вызовите atof на std::string.c_str. альтернативно, вы можете использовать строки c, но тогда это не будет C ++.

альтернативно, создайте собственную версию atof себя, используя источник, скажем, stdlibc или basic math.

0 голосов
/ 21 сентября 2010

Я бы порекомендовал sscanf

[править]

при дальнейшем рассмотрении может показаться, что вам придется использовать strstr, так как sscanf может иметь проблемы со встроенным '-'

далее, страница должна дать вам хорошее начало для поиска (и удаления) вашего '-' символа

[/ править]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...