本节我们探讨字符串和数字之间的相互转换。大多数编程语言(或库)会自动执行这些转换,因此新手程序员通常不会意识到这些转换。下面是几种不同语言中字符串和数字的相互转换,非常简单:
上面每一条语句中的变量i保存的都是整数。然而,用户在控制台输入的却是字符串。编程语言的运行时库负责将字符串转换为CPU需要的内部二进制格式。注意,Swift只允许从标准输入中读取字符串。必须使用Int()构造函数/类型转换函数将字符串显式地转换为整数。
如果不了解这些语句背后的成本,也就不会意识到它们对程序造成的影响,特别是在性能至关重要的时候。了解转换算法的底层实现非常重要,这样就不会盲目地使用这些语句。
注意: 为简单起见,我们只讨论无符号整数值,也不考虑非法字符和数字溢出的情冴。因此,下面这个算法比实际的实现要简单一些。
将十进制数字字符串转换为整数值的算法如下:
1.将一个变量初始化为0,最终结果将保存在这个变量中。
2.如果字符串中没有数字,则算法转换完成,变量中保存的就是转换后的数值。
3.获取字符串中的下一个(从左向右)数字,将其从ASCII字符转换为整数。
4.将变量中保存的值乘以10,然后加上步骤3得到的数值。
5.回到步骤2并重复后面的步骤。
将整数值转换为字符串复杂一些:
1.初始化一个空字符串。
2.如果整数值为0,则输出字符0,算法转换完成。
3.将当前整数值除以10,计算出余数和商。
4.将余数(始终在0..9 之间)转换为字符,然后将该字符插入字符串的开头。
5.如果商不为0,用它作为新的整数值,重复步骤3、4、5。
6.输出字符串中的字符。
这些算法的细节并不是很重要。重要的是每输出一个字符,上面这些步骤就要执行一遍,而且除法执行起来还特别慢。下面这些简单的语句背后隐藏了大量工作,但有些程序员无法感知:
并不是说要完全规避数字和字符串之间的转换。但是,优秀的程序员会注意这一点,只有在必要时才会使用这些转换。
请记住,这些算法仅适用于无符号整数。带符号整数的转换更复杂(尽管额外的工作几乎可以忽略不计)。涉及浮点数的字符串和数字之间的转换更为复杂,因此在编写浮点运算代码时要特别注意。