2.1.3 工作原理
如果要将整数类型或浮点类型转换为字符串类型,可以使用std::to_string()函数(它将转换为std::string)或者std::to_wstring()函数(它将转换为std::wstring)。这些函数在头文件<string>中可用,并且具有用于有符号和无符号整数以及实数类型的重载。当为每种类型使用适当的格式说明符调用时,它们会产生与std::sprintf()或者std::swprintf()函数相同的效果。下面的代码片段列出了这两个函数的所有重载:
当涉及相反的转换时,有一组名称格式为ston(代表string to number)的函数,其中n代表i(代表integer)、l(代表long)、ll(代表long long)、ul(代表unsigned long)或ull(代表unsigned long long),以此类推。下面列出了这些函数,每个函数都有两个重载版本:其中一个将std::string作为第一个参数,另一个将std::wstring作为第一个参数。
将字符串转换为整数类型的函数的方法是丢弃非空格字符前的所有空格字符,然后尽可能多地提取字符以形成有符号或无符号数字(取决于具体情况),然后将其转换为请求的整数类型(stoi()将返回一个整数,stoul()将返回一个无符号长整型类型,以此类推)。在以下所有示例中,结果都是整数42(最后一个示例除外,它的结果是-42):
有效整数由以下部分组成:
❍ 符号,+或-(可选);
❍ 前缀0表示八进制(可选);
❍ 前缀0x或0X表示十六进制(可选);
❍ 数字序列。
仅当指定的基数为8或0时,才应用可选前缀0(用于八进制);类似地,仅当指定的基数为16或0时,才应用可选前缀0x或0X(用于十六进制)。
将字符串转换为整数的函数有三个参数:
❍ 输入字符串;
❍ 指针,当它不为空时,将接收已处理的字符数,这可能包括任何被丢弃的前导空格、符号位和进制前缀,因此它不应与整数值的位数混淆;
❍ 表示进制的数字,默认情况下是10。
输入字符串中的有效数字取决于进制。对于二进制,唯一有效的数字是0和1;对于5进制,它们是0~4;对于11进制,有效数字是0~9以及字符A和a;这可以一直持续到36进制,其中包含有效字符0~9、A~Z和a~z。
下面是将不同进制的数字字符串转换为十进制整数的其他示例。同样,最终计算结果都是42或-42:
需要重点注意的是,如果转换失败,这些转换函数会抛出异常。它们可以抛出以下两种异常:
❍ std::invalid_argument:不能进行转换时抛出。
❍ std::out_of_range:转换后的值超出结果类型所能表示的范围(或者底层函数将errno设置为ERANGE)时抛出。
另一组将字符串转换为浮点类型的函数也类似,只是它们没有表示进制的参数。一个有效的浮点数值可以在输入字符串中有不同的表示形式:
❍ 十进制浮点表达式(包含可选符号、带可选点的十进制数字序列、可选e或E,后跟带有可选符号的指数)。
❍ 二进制浮点表达式(包含可选符号、0x或0X前缀、带可选点的十六进制数字序列、可选p或P,后跟带可选符号的指数)。
❍ 无限表达式(包含可选符号,后跟不区分大小写的INF或INFINITY)。
❍ 非数字表达式(包含可选符号,后跟不区分大小写的NAN和可能的其他字母数字字符)。
以下是将字符串转换为双精度浮点数的各种示例:
二进制浮点数的科学计数法(如前面的表示形式0xF.6E6666p3),并不是本小节的主题。但是,为了方便理解,这里提供了一个简短的描述,建议读者查看其他参考资料(例如https://en.cppreference.com/w/cpp/language/floating_literal)以了解详细信息。二进制科学计数法中的浮点常数由以下几个部分组成:
❍ 16进制前缀0x;
❍ 整数部分,在本例中为F,即十进制的15;
❍ 小数部分,在本例中是6E6666或二进制的011011100110011001100110,为了将其转换为小数,我们需要将2的幂的倒数相加,即1/4+1/8+1/32+1/64+1/128+…;
❍ 后缀,代表2的幂,在本例中,p3表示2的3次方。
转换为十进制的值通过有效值(由整数和小数部分组成)与基数的指数幂相乘确定。
对于上述给定的二进制浮点数字面量的十六进制表示,有效值为15.4312499…(请注意第七位数字后的数字没有显示),基数是2,指数是3。因此,结果是15.4312499…*8,即123.44999980926514。