[x]
类型转换:补完函数 convertStringToNumber, convertNumberToString1. 老师提供的参考待补齐版本:
<script>
function convertStringToNumber(string, x) {
if (arguments.length < 2)
x = 10;
var chars = string.split('');
var number = 0;
var i = 0;
while (i < chars.length && chars[i] != '.') {
number = number * x;
number += chars[i].codePointAt(0) - '0'.codePointAt(0);
i++;
}
if (chars[i] === '.') {
i++;
}
var fraction = 1;
while (i < chars.length) {
fraction = fraction / x;
number += (chars[i].codePointAt(0) - '0'.codePointAt(0)) * fraction;
i++;
}
return number;
}
convertStringToNumber("100");
function convertNumberToString(number, x) {
var integer = Math.floor(number);
var fraction = number - integer;
var string = '';
while (integer > 0) {
string = String(integer % x) + string;
integer = Math.floor(integer / x);
}
return string;
}
convertNumberToString(100.1, 10);
</script>
2. 需求分析
2.1 字符串转数值
2.2 数值转字符串功能
对于16进制的情况,取余函数结果大于等于10的时候需要转换成ABCDEF
3. 字符串转数值(含指数部分)
function convertStringToNumber(string){
// 判断字符串合法性
r1 = /^(0b|0B)(0|1)+$/
r2 = /^(0o|0O)[0-7]+$/
r3 = /^(0x|0X)[0-9a-fA-F]+$/
r4 = /(^(0|([1-9]\d*)).(\d*)?((e|E){1}(\+|\-)?\d+)?$)|(^.\d+((e|E){1}(\+|\-)?\d+)?$)|(^(0|([1-9]\d*))((e|E){1}(\+|\-)?\d+)?$)/
if (r1.exec(string) !== null) {
return convertS2N(string.slice(2),2)
}
else if (r2.exec(string) !== null) {
return convertS2N(string.slice(2),8)
}
else if (r3.exec(string) !== null) {
return convertS2N(string.slice(2),16)
}
else if (r4.exec(string) !== null) {
// 判断字符串中是否含有指数部分
if (string.includes('e')) {
// 拆分实数部分和指数部分
chars=string.split('e')
console.log(chars)
num = convertS2N(chars[0])
exponent = 1
// 判断指数部分符号位
if (chars[1][0]==='-') {
exponent = -1
chars[1] = chars[1].slice(1)
}
// 指数部分无意义的“+”和前置的0
if (chars[1][0]==='+') {
chars[1]= chars[1].slice(1)
}
exponent = exponent * convertS2N(chars[1])
num=num*Math.pow(10,exponent)
return num
}
else if (string.includes('E')) {
// 拆分实数部分和指数部分
chars=string.split('E')
console.log(chars)
num = convertS2N(chars[0])
exponent = 1
// 判断指数部分符号位
if (chars[1][0]==='-') {
exponent = -1
chars[1] = chars[1].slice(1)
}
// 指数部分无意义的“+”和前置的0
if (chars[1][0]==='+') {
chars[1]= chars[1].slice(1)
}
exponent = exponent * convertS2N(chars[1])
num=num*Math.pow(10,exponent);
return num;
}
else {
return convertS2N(string)
}
}
else {
return null
}
}
// 老师提供的部分 修改一下名字
function convertS2N(string, x) {
if (arguments.length < 2)
x = 10;
var chars = string.split('');
var number = 0;
var i = 0;
while (i < chars.length && chars[i] != '.') {
number = number * x;
number += chars[i].codePointAt(0) - '0'.codePointAt(0);
i++;
}
if (chars[i] === '.') {
i++;
}
var fraction = 1;
while (i < chars.length) {
fraction = fraction / x;
number += (chars[i].codePointAt(0) - '0'.codePointAt(0)) * fraction;
i++;
}
return number;
}
// 测试
console.log(convertStringToNumber("0B1010"));
console.log(convertStringToNumber("0b1110"));
console.log(convertStringToNumber("0O1053"));
console.log(convertStringToNumber("0o1760"));
console.log(convertStringToNumber("0x1ab8"));
console.log(convertStringToNumber("0X1AB0"));
console.log(convertStringToNumber("132"));
console.log(convertStringToNumber("100.123"));
console.log(convertStringToNumber(".164"));
console.log(convertStringToNumber("132E12"));
console.log(convertStringToNumber("100.123e-23"));
console.log(convertStringToNumber(".164e+2"));
console.log(convertStringToNumber(".164e+02"));
console.log(convertStringToNumber(".164e002"));
console.log(convertStringToNumber(".164E00000000"));
console.log(convertStringToNumber("0xER2312"));
4. 数值转字符串
function convertNumberToString(number, x) {
if (arguments.length < 2)
x = 10;
var integer = Math.floor(number);
var fraction = number - integer;
var string = '';
while (integer > 0) {
if (integer % x < 10 ) {
string = String(integer % x) + string;
}
else if (integer % x === 10 ) {
string = "A" + string;
}
else if (integer % x === 11 ) {
string = "B" + string;
}
else if (integer % x === 12 ) {
string = "C" + string;
}
else if (integer % x === 13 ) {
string = "D" + string;
}
else if (integer % x === 14 ) {
string = "E" + string;
}
else if (integer % x === 15 ) {
string = "F" + string;
}
integer = Math.floor(integer / x);
}
return string;
}