Форум программистов, компьютерный форум CyberForum.ru

Преобразования строки в число - C++

Восстановить пароль Регистрация
 
zabuka
 Аватар для zabuka
1 / 1 / 0
Регистрация: 16.12.2010
Сообщений: 38
27.02.2011, 23:06     Преобразования строки в число #1
Добрый вечер! Знаю, что подобная проблема здесь уже поднималась, однако решение ее я так и не нашел.
Суть задачи: ввести сумму используя стандартный класс string или массив строк и преобразовать в число типа double.
Написал код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
double mstold(string m);
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
    string m1;
    cout << "Введите денежную сумму (используйте символ $): ";
    getline(cin, m1);
    double y ;
    y = mstold(m1);
    cout << '\x24' << y << endl;
    system("PAUSE");
    return 0;
}
//------------------------------------------------------------------------------------------------------
//
double mstold(string m)
{
    int x = m.find(',');
    while(x < m.size())
    {
        m.erase(x, 1);
        x = m.find(',');
    }
        m.erase(0,1);
    double y;
    y = stold(m);
    return y;
}
Проблема: отбрасывает значения после точки, хотя, как я понимаю, функция преобразования не должна этого делать.
Может быть кто-то сталкивался с подобной проблемой?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.02.2011, 23:06     Преобразования строки в число
Посмотрите здесь:

Дано целое число. Вывести его строку-описание вида «отрицательное чет-ное число», «нулевое число», «положительное нечетное число» и т. д. C++
C++ из строки --> Число
C++ Метод для преобразования строки
Из строки в число C++
Почему при преобразования из float в double коверкается число? C++
C++ Массив: Напечатать номер каждой строки, в которой второй элемент меньше среднего арифметического элементов этой строки, и число таких строк.
C++ Оператор преобразования типа и его эквивалентные замены, поиск строки в текстовом файле , содержащей заданный
C++ В динамической матрице целых чисел добавить строки после строки, содержащей простое число

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
28.02.2011, 00:09     Преобразования строки в число #2
Если вас устроит sscanf:

C++
1
2
3
4
5
6
7
8
9
10
11
string str;
double result;
bool read;
 
do
{
   cout << "> ";
   getline( cin, str );
   read = sscanf( str.c_str(), "%d", &result );
}
while( !read );
Удачи.

Добавлено через 37 минут
Вот это если ручками:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
double StrToDouble( string::const_iterator beg, string::const_iterator end )
{       
    int secondPartLng = 0; //длина части после запятой
    double result = 0;     //финальное число
    string buffer;         //временный буфер
    string::const_iterator it = beg;
    
    //ищем разделитель целой и дробной части или конец фрагмента строки
    while( *it != '.' && *it != ',' && it != end )
       it++;
    
    copy( beg, it, back_inserter( buffer ) ); //копируем целую часть в буфер
    result = atoi( buffer.c_str() );          //и конвертируем её в число
    
    buffer.clear();     //очищаем буфер
    
    if( it != end )
       it++; //пропускаем разделитель
    else
       return result;
    
    //ищем конец дробной части (на случай наличия текста далее)
    string::const_iterator it2 = it;
    while( isdigit(*it2) && it2 != end )
       it2++;
    
    copy( it, it2, back_inserter( buffer ) ); // копируем дробную часть в буфер
    secondPartLng = buffer.length();          // запоминаем её длину
    
    // Расчёт:
    result += float( atoi( buffer.c_str() ) ) * ( 1 / pow( 10, secondPartLng ) );
    
    // Выполняется так:
    //  515.412
    //  412 (длина = 3)
    //  1 / 10^3 = 1/1000 = 0.001 // ^ - здесь оператор возведения в степень. В C++ этот оператор выполняет XOR - не путать!
    //  412 * 0.001 = 0.412
    //  515 + 0.412 = 515.412
    
    return result;
}
C++
1
2
3
string str;
getline( cin, str );
cout << setprecision(10) << StrToDouble( str.begin(), str.end() ) << endl;
Так же можно передать отдельный участок строки, если соответствующим образом установить итераторы.

P.S. Вы писали:
C++
1
double mstold(string m)
Я бы не рекомендовал передавать строку целиком, такие вещи лучше передавать по ссылке:
C++
1
double mstold(string &m)
Если не нужно менять строку, передайте с модификатором const.

Удачи.
Yandex
Объявления
28.02.2011, 00:09     Преобразования строки в число
Ответ Создать тему
Опции темы

Текущее время: 22:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru