字符串类型的数字转为相应的数字

本文介绍字符与数字之间的转换方法,包括隐式转换、使用stringstream进行数字与字符串的互换,以及自定义函数实现字符串到数字的转换。还讨论了stringstream使用的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字符如何隐式的转换为数字:一个字符型的数字减去‘0’后就会隐式地转换为数字,一个数字加上‘0’后就会隐式地转换为字符。

         intnum='9'-'0';

         chara=9+'0';

         int inta=9+'0';

         cout<<"num:"<<num<<endl;

         cout<<"a:"<<a<<endl;

         cout<<"inta:"<<inta<<endl;


1.1        使用stringstream

number to string

1
2
3
4
5
6
7
8
9
10

int Number = 123;//number to convert int a string

string Result;//string which will contain the result

 

stringstream convert; // stringstream used for the conversion

 

convert << Number;//add the value of Number to the characters in the stream

 

Result = convert.str();//set Result to the content of the stream

 

//Result now is equal to "123"

string to number

1
2
3
4
5
6
7
8

string Text = "456";//string containing the number

int Result;//number which will contain the result

 

stringstream convert(Text); // stringstream used for the conversion initialized with the contents of Text

 

if ( !(convert >> Result) )//give the value to Result using the characters in the string

    Result = 0;//if that fails set Result to 0

//Result now equal to 456

Simple functionsto do these conversions

1
2
3
4
5
6
7

template <typename T>

string NumberToString ( T Number )

{

               stringstream ss;

               ss << Number;

               return ss.str();

}

 

1
2
3
4
5
6
7

template <typename T>

T StringToNumber ( const string &Text )//Text not by const reference so that the function can be used with a

{                               //character array as argument

               stringstream ss(Text);

               T result;

               return ss >> result ? result : 0;

}

 

    缺点:

1)       内存风险

#include<cstdlib>

#include<iostream>

#include<sstream>

usingnamespace std;

intmain(int argc, char *argv[])

{

       std::stringstream stream;

       string str;

       while(1)

       {  

              //clear(),这个名字让很多人想当然地认为它会清除流的内容

              //实际上,它并不清空任何内容,它只是重置了流的状态标志而已

              stream.clear(); 

              // 去掉下面这行注释,清空stringstream的缓冲,每次循环内存消耗将不再增加!

              //stream.str("");     

              stream<<"sdfsdfdsfsadfsdafsdfsdgsdgsdgsadgdsgsdagasdgsdagsadgsdgsgdsagsadgs";

              stream>>str;  

              // 去掉下面两行注释,看看每次循环,你的内存消耗增加了多少!

              //cout<<"Size of stream= "<<stream.str().length()<<endl;

              //system("PAUSE");

       }

       system("PAUSE");不应该使用,可以用其他语句代替,如cin.get())。

       return EXIT_SUCCESS;

}    把stream.str("");   那一行的注释去掉,再运行程序,内存就正常了

 看来stringstream似乎不打算主动释放内存(或许是为了提高效率),但如果你要在程序中用同一个流,反复读写大量的数据,将会造成大量的内存消耗,因些这时候,需要适时地清除一下缓冲 ( stream.str("") )

 另外不要企图用stream.str().resize(0),或stream.str().clear() 来清除缓冲,使用它们似乎可以让stringstream的内存消耗不要增长得那么快,但仍然不能达到清除stringstream缓冲的效果(不信做个实验就知道了,内存的消耗还在缓慢的增长!),至于stream.flush(),则根本就起不到任何作用。

1.2        自定义字符串转数字

long atoi(const char *str)

{

    long num = 0;

    int neg = 0;

    while (isspace(*str)) str++;

    if (*str == '-')

    {

        neg=1;

        str++;

    }

    while (isdigit(*str))

    {

        num = 10*num + (*str - '0');

        str++;

    }

    if (neg)

        num = -num;

    return num;

 }

<think>好的,用户现在问的是如何将字符串换为数字。之前他们问过关于Python格式化字符串的问题,现在可能是在数据处理或输入处理中遇到了需要换的情况。我需要先确定用户的使用场景,可能是在读取文件、处理用户输入,或者数据解析时需要字符串数字。 首先,用户可能对不同的换方法不太清楚,比如整数、浮点数、不同进制的处理,还有错误处理的情况。需要覆盖基本的方法,比如int()和float()函数的使用,同时也要提到更复杂的情况,比如进制换、科学计数法,以及异常处理的重要性。 考虑到用户之前的问题是关于格式化字符串的,他们可能对字符串操作有一定了解,但可能在换时遇到类型错误或格式问题。比如,字符串中包含非数字字符,或者小数点的问题。这时候需要提醒用户注意异常处理,比如使用try-except块来捕捉ValueError和TypeError。 另外,用户可能需要处理不同格式的数字字符串,比如带有千分位分隔符的,或者科学记数法表示的。这时候需要给出相应的处理方法,比如替换逗号或者使用float()来处理科学记数法。 还要考虑用户是否知道如何处理布尔字符串,虽然布尔类型严格来说不是数字,但有时候可能需要换。这里需要说明如何将"True"或"False"换为1或0,但也要提醒用户注意直接使用bool()的情况,因为非空字符串换为True,这可能不是他们想要的。 对于更复杂的情况,比如混合字母和数字字符串(如十六进制),可能需要使用int()的base参数,或者自定义解析函数。这时候需要给出示例,比如处理十六进制字符串,或者提取字符串中的数字部分。 最后,用户可能关心性能或最佳实践,比如在大量数据换时推荐使用列表推导式或生成器表达式,或者使用第三方库如pandas进行高效处理。这时候需要简要提及这些方法,但重点放在标准库的解决方案上。 需要确保回答结构清晰,分点说明各种换方法和注意事项,避免信息过载,同时提供代码示例帮助理解。还要提醒用户注意常见的陷阱,比如本地化中的逗号小数点问题,以及异常处理的重要性,避免程序因无效输入而崩溃。</think>将字符串换为数字是编程中常见的操作,主要涉及整数、浮点数等类型。以下是不同场景下的换方法和注意事项: --- ### **一、基础换** #### 1. 字符串 → 整数 (`int`) ```python s = "123" num = int(s) # 输出:123 (int类型) ``` #### 2. 字符串 → 浮点数 (`float`) ```python s = "3.14" num = float(s) # 输出:3.14 (float类型) ``` --- ### **二、特殊格式处理** #### 1. 科学计数法 ```python s = "1.23e5" num = float(s) # 输出:123000.0 ``` #### 2. 千分位分隔符 ```python s = "12,345.67" num = float(s.replace(",", "")) # 输出:12345.67 ``` #### 3. 布尔值字符串 ```python s = "True" num = int(s.lower() == "true") # 输出:1 (False→0) ``` --- ### **三、进制换** #### 1. 二进制 → 十进制 ```python s = "1010" num = int(s, 2) # 输出:10 ``` #### 2. 十六进制 → 十进制 ```python s = "1A" num = int(s, 16) # 输出:26 ``` --- ### **四、错误处理** #### 1. 无效字符捕获 ```python s = "12a3" try: num = int(s) except ValueError: print("非数字字符") # 触发此分支 ``` #### 2. 空值/类型错误 ```python s = None try: num = int(s) except TypeError: print("输入不能为None") # 触发此分支 ``` --- ### **五、高级场景** #### 1. 混合字母与数字 ```python s = "abc123xyz" # 提取数字部分 digits = ''.join(filter(str.isdigit, s)) # 输出:"123" num = int(digits) if digits else 0 ``` #### 2. 多语言本地化处理 ```python s = "3,14" # 欧洲格式的小数 num = float(s.replace(",", ".")) # 输出:3.14 ``` --- ### **六、性能优化** #### 1. 批量换 ```python str_list = ["1", "2", "3"] nums = [int(x) for x in str_list] # 列表推导式 ``` #### 2. 使用第三方库 ```python import pandas as pd series = pd.Series(["1.1", "2.2", "3.3"]) nums = series.astype(float) # 高效处理大数据量 ``` --- ### **注意事项** 1. **前导/后导空格** ```python s = " 42 " num = int(s.strip()) # 使用strip()清理空格 ``` 2. **精度损失问题** ```python s = "0.1" print(0.1 + 0.2 == 0.3) # False (浮点运算误差) ``` 3. **零值判断陷阱** ```python s = "0" if int(s): # 0会被判定为False print("非零") else: print("零值") # 输出此分支 ``` --- 根据具体需求选择合适的换策略,建议优先使用`try-except`处理异常输入。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值