resultado - Cómo redondear en Javascript/Angular JS-pero eliminar dígitos insignificantes
redondear decimales javascript (3)
Como las otras respuestas realmente no funcionaron bien, o no incorporaron o no trabajaron con el servicio $ locale de Angular, escribí el siguiente filter
:
Modelo:
<span>{{yourNumber | roundTo: N}}</span>
Filtrar:
app.filter(''roundTo'', function(numberFilter) {
return function(value, maxDecimals) {
return numberFilter((value || 0)
.toFixed(maxDecimals)
.replace(/(?:/.0+|(/./d+?)0+)$/, "$1")
);
}
})
Redondea el número al número máximo de decimales.
Recorta todos los ceros finales
Elimina el separador decimal cuando no es necesario
Y utiliza el formato de $ locale de Angular
Tengo la siguiente declaración en mi controlador de Javascript:
$scope.myList = [0, 1, 0.5, 0.6666666];
La plantilla de Mi AngularJS incluye lo siguiente:
<div ng-repeat="i in myList">{{i}}</div>
Esto produce el siguiente resultado HTML:
<div>0</div>
<div>1</div>
<div>0.5</div>
<div>0.6666666</div>
Sin embargo, quiero que los números se redondeen a 2 decimales. Sin embargo, me gustaría ver solo dígitos significativos en la salida. No quiero ver ceros finales. ¿Cómo lo hago? Utilizando {{i | number:2}}
{{i | number:2}}
no elimina los ceros finales.
Lo haría así:
<div ng-repeat="i in myList">{{formatNumber(i)}}</div>
y en tu mando:
$scope.formatNumber = function(i) {
return Math.round(i * 100)/100;
}
Puedes simplemente multiplicar por 1 para convertirlo en valor verdadero.
<div ng-repeat="i in myList">{{(i | number:2)*1}}</div>
Como se señaló en los comentarios anteriores, la solución se interrumpirá debido al formato de la configuración regional mediante el filtro de número angular. Si necesita el formato y el redondeo de la configuración regional, puede crear un filtro de extensión que, debajo, utilice el number filter
y el servicio $locale
.
.filter(''numberEx'', [''numberFilter'', ''$locale'',
function(number, $locale) {
var formats = $locale.NUMBER_FORMATS;
return function(input, fractionSize) {
//Get formatted value
var formattedValue = number(input, fractionSize);
//get the decimalSepPosition
var decimalIdx = formattedValue.indexOf(formats.DECIMAL_SEP);
//If no decimal just return
if (decimalIdx == -1) return formattedValue;
var whole = formattedValue.substring(0, decimalIdx);
var decimal = (Number(formattedValue.substring(decimalIdx)) || "").toString();
return whole + decimal.substring(1);
};
}
]);
Y utilízalo como:
<div ng-repeat="i in myList">{{i | numberEx:2}}</div>
Manifestación
angular.module(''app'', []).controller(''ctrl'', function($scope) {
$scope.myList = [0, 10000.56, 0.5, 0.6666666, -1000.23123, 1, 1002, 2.5, 30.5, 22];
}).filter(''numberEx'', [''numberFilter'', ''$locale'',
function(number, $locale) {
var formats = $locale.NUMBER_FORMATS;
return function(input, fractionSize) {
//Get formatted value
var formattedValue = number(input, fractionSize);
//get the decimalSepPosition
var decimalIdx = formattedValue.indexOf(formats.DECIMAL_SEP);
//If no decimal just return
if (decimalIdx == -1) return formattedValue;
var whole = formattedValue.substring(0, decimalIdx);
var decimal = (Number(formattedValue.substring(decimalIdx)) || "").toString();
return whole + decimal.substring(1);
};
}
]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app" ng-controller="ctrl">
<div ng-repeat="i in myList">{{i | numberEx:2}}</div>
</div>