2013-04-20 44 views
3

我需要为我的应用打印非常小的数字。我更喜欢它们是否都以十进制格式显示。有没有办法做到这一点与angularjs数字过滤器,或者我必须自己写或修改现有的?Angularjs避免数字过滤器的科学记数法

http://jsfiddle.net/ADukg/2386/

的Javascript

var myApp = angular.module('myApp',[]); 

function MyCtrl($scope) { 
    $scope.MyNum1 = 0.000001; 
    $scope.MyNum2 = 0.0000001; 
} 

HTML

<div ng-controller="MyCtrl"> 
    Small Number: {{MyNum1 | number:8}}<br/> 
    Very Small Number: {{MyNum2 | number:8}} 
</div> 

不一致的输出

Small Number: 0.00000100 
Very Small Number: 1e-7 

回答

4

我还没有完全测试这个,我不知道如何让这个工作在jsfiddle,但这似乎是暂时工作。

的Javascript

var app = angular.module('myApp', []); 

app.filter('decimalFormat', function() { 
    return function (text) { 
    return parseFloat(text).toFixed(20).replace(/0+$/,''); 
    }; 
}); 

HTML

<div ng-controller="MyCtrl"> 
    Small Number: {{MyNum1 | number:8 | decimalFormat}}<br/> 
    Very Small Number: {{MyNum2 | number:8 | decimalFormat}} 
</div> 

后编辑兰登的评论,添加逗号:

的Javascript

var app = angular.module('myApp', []); 

app.filter('decimal', function() { 
    return function (text) { 
     var parts = parseFloat(text).toFixed(8).split('.'); 
     parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ','); 
     return parts.join('.'); 
    } 
    }; 
}); 

function MyCtrl($scope) { 
    $scope.MyNum1 = 0.12345678912; 
    $scope.MyNum2 = 0.000000100001; 
    $scope.MyNum3 = 0; 
    $scope.MyNum3 = 1123123.05; 
} 

HTML

<div ng-controller="MyCtrl"> 
    Small Number: {{MyNum1 | decimal}}<br/> 
    Very Small Number: {{MyNum2 | decimal}}<br/> 
    Zero: {{MyNum3 | decimal}}<br/> 
    Million: {{MyNum4 | decimal}}<br/> 
</div> 
+0

是的,这是正确的,除了你不再需要'number:8'过滤器,你应该简化'decimalFormat'到'decimal'。你输的唯一东西(那个Angular的数字过滤器对你来说)就是i18n。 http://jsfiddle.net/fH9bM/ – Langdon 2013-04-20 16:17:17

+0

您的编辑版本在过滤器功能中引入了一个额外的大括号,但编辑过于微不足道。我也在自己的版本中为'toFixed()'调用的地方添加了一个参数,但我认为这可能会改变你的函数的意图,以至于不能在这里建议编辑。 – Danny 2015-06-11 16:40:41

1

这是为了返回个大数字为十进制,但它的工作原理,以及对小型全1

Number.prototype.noExponents= function(){ 
    var data= String(this).split(/[eE]/); 
    if(data.length== 1) return data[0]; 

    var z= '', sign= this<0? '-':'', 
    str= data[0].replace('.', ''), 
    mag= Number(data[1])+ 1; 

    if(mag<0){ 
     z= sign + '0.'; 
     while(mag++) z += '0'; 
     return z + str.replace(/^\-/,''); 
    } 
    mag -= str.length; 
    while(mag--) z += '0'; 
    return str + z; 
} 

var n=1e-7; 
n.noExponents(); 
returned value: (String) '0.0000001'; 
+0

您是否在此期间更新了此功能?或者你还在使用这个? – kape123 2014-03-01 00:42:40

3

你将不得不写自己的,因为在源现有的过滤器不处理大小数位(见formatNumberfilters.js)。最终问题是调用toString以在您的HTML中显示数字。更理想的情况下,toFixed可能会被调用,但这会变得棘手,因为你必须找出小数的长度。

console.log(0.000001); 
> 0.000001 
console.log(0.0000001); 
> 1e-7 
console.log(0.0000001.toFixed(20)); 
> 0.00000010000000000000 

这里有一个快速的黑客:

console.log(0.0000001.toFixed(20).replace(/0+$/, '')); 
> 0.0000001 

所以您的自定义过滤器可以是这么简单。尽管如此,我会建议在GitHub上提交一个问题。

+0

在这里打开一个问题:https://github.com/angular/angular.js/issues/2456 Thx。 – user1071182 2013-04-20 04:39:23