将奇怪的字符串转换为双C++

Converting strange string to double C++

我需要将数据从文件转换为双精度数据,有时数据的格式为:

0.3387000000D+02  0.6067999217D-02
0.5095000000D+01  0.4530799416D-01
0.1159000000D+01  0.2028219738D+00
0.3258000000D+00  0.5039029350D+00
0.1027000000D+00  0.3834209505D+00

你会如何处理这里的 D

这是科学记数法,只是 D 而不是 E

我正在考虑在这里使用 std::regex,但我希望有一个更优雅的策略。

类似于以下内容:

std::regex rr( "((\+|-)?[[:digit:]]+)(\.(([[:digit]]+)?))?(d|D)((\+|-)?)[[:digit:]]+)""?"); 

D替换为Estd::replace,之后就直接了:

Live demo

std::string s = "0.3387000000D+02";
std::replace( s.begin(), s.end(), 'D', 'E');
std::cout << std::stod(s);

std::replace_if:

Live demo

bool isD(char c) { 
    return c == 'D'; 
}
std::string s = "0.3387000000D+02";
std::replace_if( s.begin(), s.end(), isD, 'E');
std::cout << std::stod(s);

输出:

33.87

你可以这样做。

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <cmath>

double string2double(std::string s)
{
    // Find the index of scientific D
    int indexD = s.find('D');
    // separate the base from rest, start at 0 and go till index of D, without D
    std::string number = s.substr(0, indexD);
    //indexD+2 to ignore D and plus 
    std::string power = s.substr(indexD+2);
    
    // do conversion from string to number
    double rawNumber = std::stod(number);
    double powerNumber = std::stod(power);
    //test
    std::cout << rawNumber << std::endl;
    std::cout << powerNumber << std::endl;
    //return
    return rawNumber * std::pow(10, powerNumber);
}



int main()
{   

    std::string s = "0.3387000000D+02";
    std::cout << string2double(s) << std::endl;
    return 0;
}