Number.prototype.toDecimal方法实现

原创 2017年01月03日 09:54:51

JavaScript中,数字可以被转化为字符串。例如(123.456).toString(),你将会得到字符串形式的"123.456"

某些时候,因为数字太大或太小,我们无法直接展示数字,就会用到一种“科学计数法”。

下面有一些科学计数法的简单例子:

100 == 1e+2

0.01 == 1e-2

12.34 == 1.234e+1

0.000456 == 4.56e-4

在这个计数法里面,e代表10e左边的是系数,e右边的是指数。

那么,如何编写一个将数字(包括科学计数法)转化为字符串的方法呢?

注意这里,比如1e+2,我们转化为字符串时,期望得到完整的数字”100”,而不是”1e+2”。再比如说1e-2,我们转化后期望得到”0.01”,而不是”1e-2”,这就需要我们对它进行处理。

Number.prototype.toDecimal = function() {
	//先转化为字符串
    var str = this + "";
    var ePos = str.indexOf("e");
	//如果是科学计数法表示的
    if(ePos >= 0){
		//截取系数
        var coefficient = str.slice(0,ePos);
		//截取指数
        var exponent = str.slice(ePos+1);
        var signPos = exponent.indexOf("-");
		//如果指数为负
        if(signPos >= 0){
            var array = null;
			//系数是否有小数点
            var pointPos = coefficient.indexOf(".");
            if(pointPos < 0){
				//例如1e-1要得到"0.1"
				//那么得创建为3的数组来存储
				//new Array(1 + 1 + 1)
                array = new Array(coefficient.length + parseInt(exponent.slice(signPos+1)) + 1);
            }
            else{
				//例如1.1e-1要得到"0.11"
				//那么得创建为4的数组来存储
				//new Array(3 + 1)
                array = new Array(coefficient.length + parseInt(exponent.slice(signPos+1)));
            }
			//例如1.1e-3
			//=>[,,,,,]
			//=>[,,,,1,1]
            for(var i=coefficient.length-1,j=array.length-1;i>=0;i--,j--){
                var chr = coefficient.charAt(i);
                if(chr !== "."){
                    array[j] = chr;
                }
                else{
                    j += 1;
                }
            }
			//=>[0,0,0,0,1,1]
            for(i=j;i>=0;i--){
                array[i] = 0;
            }
			//=>[0,.,0,0,1,1]
            array[1] = ".";
			//=>"0.0011"
            return array.join("");
        }
        else{
            var result = "";
            var pointPos = coefficient.indexOf(".");
            var zeroNum = 0;
			//如果没有小数点
            if(pointPos < 0){
				//拼接指数个0
				//例如1e3
				//=>"1000"
				//要拼接3个0
                zeroNum = parseInt(exponent);
                result = coefficient;
            }
            else{
				//例如1.1e3
				//=>"1100"
				//要拼接3 - (3 - 1 - 1) = 2 个0
                zeroNum = parseInt(exponent) - (coefficient.length - 1 - pointPos);
                result = coefficient.charAt(0) + coefficient.slice(pointPos+1);
            }
			//拼接0
            while(zeroNum--){
                result += "0";
            }
            return result;
        }
    }
    return str;
};


版权声明:本文为博主原创文章,未经博主允许不得转载。

实现javaScript对象的"继承"的两种方法(prototype与闭包)

实现javaScript对象的"继承"的两种方法(prototype与闭包)
  • canot
  • canot
  • 2016年02月28日 16:13
  • 1206

第4天(就业班) 循环语句、函数、String、Number、自定义对象、prototype原型

1. 循环语句 1.1while循环 格式: while(判断的条件){ 循环体内容 } 需求:计算1~100的总和 var num = 1; var result = 0; w...

javascript中Number有关的一些方法

  • 2014年06月04日 10:31
  • 3KB
  • 下载

mysql中实现类似于oralce中row_number()的方法

mysql的row_number()及其它应用 在mysql中没有row_number()方法,不能通过判断当前记录的行数来获取前几条记录。 所以这里通过模拟row_number()来实现。 如...

[MSSQL]SQL中Group分组获取Top N方法实现可首选row_number

有产品表,包含id,name,city,addtime四个字段,因报表需要按城市分组,统计每个城市的最新10个产品,便向该表中插入了100万数据,做了如下系列测试: 复制代码 代码如下:CREAT...

js之prototype用法(给对象添加通用属性/方法)

函数:原型 每一个构造函数都有一个属性叫做原型(prototype,下面都不再翻译,使用其原文)。这个属性非常有用:为一个特定类声明通用的变量或者函数。 prototype的定义 你...

JavaScript中如何使用原型方法--prototype

JS中的phototype是JS中比较难理解的一个部分   本文基于下面几个知识点:   1 原型法设计模式 在.Net中可以使用clone()来实现原型法 原型法...
  • Aaroun
  • Aaroun
  • 2017年10月31日 19:25
  • 69

Prototype 1.6.1和jquery 1.7.2的Ajax Post请求方法对比

//使用Prototype 1.6.1的ajax请求方法 function prototypeRequest() { new Ajax.Request('servlet/SendInjunction...
  • e_wsq
  • e_wsq
  • 2012年04月22日 15:50
  • 1015
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Number.prototype.toDecimal方法实现
举报原因:
原因补充:

(最多只允许输入30个字)