• [x] 类型转换:补完函数 convertStringToNumber, convertNumberToString

    1. 老师提供的参考待补齐版本:

    1. <script>
    2. function convertStringToNumber(string, x) {
    3. if (arguments.length < 2)
    4. x = 10;
    5. var chars = string.split('');
    6. var number = 0;
    7. var i = 0;
    8. while (i < chars.length && chars[i] != '.') {
    9. number = number * x;
    10. number += chars[i].codePointAt(0) - '0'.codePointAt(0);
    11. i++;
    12. }
    13. if (chars[i] === '.') {
    14. i++;
    15. }
    16. var fraction = 1;
    17. while (i < chars.length) {
    18. fraction = fraction / x;
    19. number += (chars[i].codePointAt(0) - '0'.codePointAt(0)) * fraction;
    20. i++;
    21. }
    22. return number;
    23. }
    24. convertStringToNumber("100");
    25. function convertNumberToString(number, x) {
    26. var integer = Math.floor(number);
    27. var fraction = number - integer;
    28. var string = '';
    29. while (integer > 0) {
    30. string = String(integer % x) + string;
    31. integer = Math.floor(integer / x);
    32. }
    33. return string;
    34. }
    35. convertNumberToString(100.1, 10);
    36. </script>

2. 需求分析

待补充的功能如下:

2.1 字符串转数值

需要加入指数相关的程序, W03-H1 类型转换 - 图1

2.2 数值转字符串功能

对于16进制的情况,取余函数结果大于等于10的时候需要转换成ABCDEF

3. 字符串转数值(含指数部分)

  1. function convertStringToNumber(string){
  2. // 判断字符串合法性
  3. r1 = /^(0b|0B)(0|1)+$/
  4. r2 = /^(0o|0O)[0-7]+$/
  5. r3 = /^(0x|0X)[0-9a-fA-F]+$/
  6. r4 = /(^(0|([1-9]\d*)).(\d*)?((e|E){1}(\+|\-)?\d+)?$)|(^.\d+((e|E){1}(\+|\-)?\d+)?$)|(^(0|([1-9]\d*))((e|E){1}(\+|\-)?\d+)?$)/
  7. if (r1.exec(string) !== null) {
  8. return convertS2N(string.slice(2),2)
  9. }
  10. else if (r2.exec(string) !== null) {
  11. return convertS2N(string.slice(2),8)
  12. }
  13. else if (r3.exec(string) !== null) {
  14. return convertS2N(string.slice(2),16)
  15. }
  16. else if (r4.exec(string) !== null) {
  17. // 判断字符串中是否含有指数部分
  18. if (string.includes('e')) {
  19. // 拆分实数部分和指数部分
  20. chars=string.split('e')
  21. console.log(chars)
  22. num = convertS2N(chars[0])
  23. exponent = 1
  24. // 判断指数部分符号位
  25. if (chars[1][0]==='-') {
  26. exponent = -1
  27. chars[1] = chars[1].slice(1)
  28. }
  29. // 指数部分无意义的“+”和前置的0
  30. if (chars[1][0]==='+') {
  31. chars[1]= chars[1].slice(1)
  32. }
  33. exponent = exponent * convertS2N(chars[1])
  34. num=num*Math.pow(10,exponent)
  35. return num
  36. }
  37. else if (string.includes('E')) {
  38. // 拆分实数部分和指数部分
  39. chars=string.split('E')
  40. console.log(chars)
  41. num = convertS2N(chars[0])
  42. exponent = 1
  43. // 判断指数部分符号位
  44. if (chars[1][0]==='-') {
  45. exponent = -1
  46. chars[1] = chars[1].slice(1)
  47. }
  48. // 指数部分无意义的“+”和前置的0
  49. if (chars[1][0]==='+') {
  50. chars[1]= chars[1].slice(1)
  51. }
  52. exponent = exponent * convertS2N(chars[1])
  53. num=num*Math.pow(10,exponent);
  54. return num;
  55. }
  56. else {
  57. return convertS2N(string)
  58. }
  59. }
  60. else {
  61. return null
  62. }
  63. }
  64. // 老师提供的部分 修改一下名字
  65. function convertS2N(string, x) {
  66. if (arguments.length < 2)
  67. x = 10;
  68. var chars = string.split('');
  69. var number = 0;
  70. var i = 0;
  71. while (i < chars.length && chars[i] != '.') {
  72. number = number * x;
  73. number += chars[i].codePointAt(0) - '0'.codePointAt(0);
  74. i++;
  75. }
  76. if (chars[i] === '.') {
  77. i++;
  78. }
  79. var fraction = 1;
  80. while (i < chars.length) {
  81. fraction = fraction / x;
  82. number += (chars[i].codePointAt(0) - '0'.codePointAt(0)) * fraction;
  83. i++;
  84. }
  85. return number;
  86. }
  87. // 测试
  88. console.log(convertStringToNumber("0B1010"));
  89. console.log(convertStringToNumber("0b1110"));
  90. console.log(convertStringToNumber("0O1053"));
  91. console.log(convertStringToNumber("0o1760"));
  92. console.log(convertStringToNumber("0x1ab8"));
  93. console.log(convertStringToNumber("0X1AB0"));
  94. console.log(convertStringToNumber("132"));
  95. console.log(convertStringToNumber("100.123"));
  96. console.log(convertStringToNumber(".164"));
  97. console.log(convertStringToNumber("132E12"));
  98. console.log(convertStringToNumber("100.123e-23"));
  99. console.log(convertStringToNumber(".164e+2"));
  100. console.log(convertStringToNumber(".164e+02"));
  101. console.log(convertStringToNumber(".164e002"));
  102. console.log(convertStringToNumber(".164E00000000"));
  103. console.log(convertStringToNumber("0xER2312"));

4. 数值转字符串

  1. function convertNumberToString(number, x) {
  2. if (arguments.length < 2)
  3. x = 10;
  4. var integer = Math.floor(number);
  5. var fraction = number - integer;
  6. var string = '';
  7. while (integer > 0) {
  8. if (integer % x < 10 ) {
  9. string = String(integer % x) + string;
  10. }
  11. else if (integer % x === 10 ) {
  12. string = "A" + string;
  13. }
  14. else if (integer % x === 11 ) {
  15. string = "B" + string;
  16. }
  17. else if (integer % x === 12 ) {
  18. string = "C" + string;
  19. }
  20. else if (integer % x === 13 ) {
  21. string = "D" + string;
  22. }
  23. else if (integer % x === 14 ) {
  24. string = "E" + string;
  25. }
  26. else if (integer % x === 15 ) {
  27. string = "F" + string;
  28. }
  29. integer = Math.floor(integer / x);
  30. }
  31. return string;
  32. }