2013-04-20 78 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