c++字符串浮点数转化

1、字符串转化为数字ato系列

atof(): 把字符串转换为浮点数

atoi():函数用来将字符串转换成整数(int)

atol():把参数 str 所指向的字符串转换为一个长整数

c++中的定义

#include 
double atof (const char* str);

返回值:

  • 正常时,该函数返回double精度的浮点数
  • 如果不能进行有效地转换,返回0.0
  • 如果转换的数值超出了double可以表示的范围,该函数会产生未定义的行为

具体使用:

#include 
#include 
#include 

int main()
{
   long val;
   char str[20];
   
   strcpy(str, "1122");   //输出1122
   val = atol(str);
   printf("字符串值 = %s, 长整型值 = %ld\n", str, val);

   // strcpy(str, "human");    //输出0
   strcpy(str, "will ai replace human?");   //strcmp数组长度溢出,trap,运行失败,修改str的长度后,输出为0
   val = atol(str);
   printf("字符串值 = %s, 长整型值 = %ld\n", str, val);

   return(0);
}

2、字符串转化为数字sto系列

std::stod(转换为double双精度),std::stof(转换为float单精度), std::stold(转换为long double长双精度),stoi,stol,stoll,stoul,stoull, from_chars(c++17,转换字符序列)

#include 

double stod (const string&  str, size_t* idx = 0);
double stod (const wstring& str, size_t* idx = 0);

其中,idx不是空指针时,该函数还将idx的值设置为数字后str中第一个字符的位置。

返回值:

正常返回double精度浮点数
不能执行转换时,抛出异常invalid_argument
超出double所能表示的范围时,抛出异常out_of_range
无效的idx会导致未定义的行为,一般默认就好

具体实例:

#include 
#include 
#include 
#include 
#include 

using namespace std;
void testTypeConvert()
{
    //int --> string
    int i = 5;
    string s = to_string(i);
    cout << s << endl;
    //double --> string
    double d = 3.14;
    cout << to_string(d) << endl;
    //long --> string
    long l = 123234567;
    cout << to_string(l) << endl;
    //char --> string
    char c = 'a';
    // cout< string
    string cStr; cStr += c;
    cout << cStr << endl;


    s = "123.257";
    //string --> int;
    cout << stoi(s) << endl;
    //string --> long
    cout << stol(s) << endl;
    //string --> float
    cout << stof(s) << endl;
    //string --> doubel
    cout << stod(s) << endl;
}

int main(){
    testTypeConvert();
    return 0;
}

3、to_string系列

使用说明:

 使用to_string时请包含头文件 ,无符号整数包括0和正数,目前仅c++11及以后版本支持使用to_string

std::string to_string( int value );

(1) (C++11 起)

std::string to_string( long value );

(2) (C++11 起)

std::string to_string( long long value );

(3) (C++11 起)

std::string to_string( unsigned value );

(4) (C++11 起)

std::string to_string( unsigned long value );

(5) (C++11 起)

std::string to_string( unsigned long long value );

(6) (C++11 起)

std::string to_string( float value );

(7) (C++11 起)

std::string to_string( double value );

(8) (C++11 起)

std::string to_string( long double value );

(9) (C++11 起)

1) 把有符号十进制整数转换为字符串,与 std::sprintf(buf, "%d", value) 在有足够大的 buf 时产生的内容相同。

2) 把有符号十进制整数转换为字符串,与 std::sprintf(buf, "%ld", value) 在有足够大的 buf 时产生的内容相同。

3) 把有符号十进制整数转换为字符串,与 std::sprintf(buf, "%lld", value) 在有足够大的 buf 时产生的内容相同。

4) 把无符号十进制整数转换为字符串,与 std::sprintf(buf, "%u", value) 在有足够大的 buf 时产生的内容相同。

5) 把无符号十进制整数转换为字符串,与 std::sprintf(buf, "%lu", value) 在有足够大的 buf 时产生的内容相同。

6) 把无符号十进制整数转换为字符串,与 std::sprintf(buf, "%llu", value) 在有足够大的 buf 时产生的内容相同。

7,8) 把浮点值转换为字符串,与 std::sprintf(buf, "%f", value) 在有足够大的 buf 时产生的内容相同。

9) 把浮点值转换为字符串,与 std::sprintf(buf, "%Lf", value) 在有足够大的 buf 时产生的内容相同。

具体实例:

#include 
#include 
 
int main() 
{
    double f = 23.43;
    double f2 = 1e-9;
    double f3 = 1e40;
    double f4 = 1e-40;
    double f5 = 123456789;
    unsigned int f6=100;
    int f7=100;
    std::string f_str = std::to_string(f);
    std::string f_str2 = std::to_string(f2); // 注意:返回 "0.000000"
    std::string f_str3 = std::to_string(f3); // 注意:不返回 "1e+40".
    std::string f_str4 = std::to_string(f4); // 注意:返回 "0.000000"
    std::string f_str5 = std::to_string(f5);

    std::string f_str6 = std::to_string(f6);
    std::string f_str7 = std::to_string(f7);

    std::cout << "std::cout: " << f << '\n'
              << "to_string: " << f_str  << "\n\n"
              << "std::cout: " << f2 << '\n'
              << "to_string: " << f_str2 << "\n\n"
              << "std::cout: " << f3 << '\n'
              << "to_string: " << f_str3 << "\n\n"
              << "std::cout: " << f4 << '\n'
              << "to_string: " << f_str4 << "\n\n"
              << "std::cout: " << f5 << '\n'
              << "to_string: " << f_str5 << '\n'
              << "std::cout: " << f6 << '\n'
              << "to_string: " << f_str6 << '\n'
              << "std::cout: " << f7 << '\n'
              << "to_string: " << f_str7 << '\n';
    return 0;
}

输出结果:

std::cout: 23.43
to_string: 23.430000

std::cout: 1e-09
to_string: 0.000000

std::cout: 1e+40
to_string: 10000000000000000303786028427003666890752.000000

std::cout: 1e-40
to_string: 0.000000

std::cout: 1.23457e+08
to_string: 123456789.000000
std::cout: 100
to_string: 100
std::cout: 100
to_string: 100

4、参考文献

c++中字符串转浮点数stod vs atof_c++stod_guotianqing的博客-CSDN博客

C/C++ atoi、atof与itoa函数的实现_c++ atoi 对于浮点数_博弈Dream的博客-CSDN博客

C++ to_string()函数_WeSiGJ的博客-CSDN博客

C 库函数 – atol() | 菜鸟教程

https://www.cnblogs.com/xiaofeiIDO/p/8092649.html (c++数字字符串相互转化)

C++ STL std::to_string 中文文档   (to_string详细用法)

你可能感兴趣的:(c++,开发语言)