angular - 角度缩短数
问题描述
我正在开发一个角度应用程序。我需要显示的数字很少。这些数字可以是 1234567.87876868。在显示此数字时,我需要以 12.9k 之类的格式显示,而我在此表单中生成数字的代码是
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'number'
})
export class numberPipe implements PipeTransform {
transform(number: number, args?: any): any {
if (isNaN(number)) return 0; // will only work value is a number
if (number === null) return 0;
if (number === 0) return 0;
let abs = Math.abs(number);
const rounder = Math.pow(10, 1);
const isNegative = number < 0; // will also work for Negetive numbers
let key = '';
const powers = [
{key: 'Q', value: Math.pow(10, 15)},
{key: 'T', value: Math.pow(10, 12)},
{key: 'B', value: Math.pow(10, 9)},
{key: 'M', value: Math.pow(10, 5)},
{key: 'K', value: 1000}
];
for (let i = 0; i < powers.length; i++) {
let reduced = abs / powers[i].value;
reduced = Math.round(reduced * rounder) / rounder;
if (reduced >= 1) {
abs = reduced;
key = powers[i].key;
break;
}
}
return (isNegative ? '-' : '') + abs + key;
}
}
在 html 中<div>{{ mynumber | number}}<div>
现在的问题是,如果数字小于 1000,它会显示原始数字,并且显示像这样的 345.4354564,在屏幕上看起来不太好。所以我需要使用数字管道( number: '1.2-2')
。但是当我将数字管道与我的自定义管道一起使用时,它不起作用。它说“12.4K 不是管道 Decimalpipe 的数字”。我该如何处理这两种情况?
解决方案
我过去遇到过同样的问题,我发现最好的解决方案是使用Math.log
.
@Pipe({
name: 'number',
})
export class NumberPipe implements PipeTransform {
transform(input: number, args?: any): string | number | null {
let exp: number;
const suffixes = ['K', 'M', 'B', 'T', 'Q', 'E'];
if (Number.isNaN(input)) {
return null;
}
if (Math.abs(input) < 1000) {
return input;
}
exp = Math.floor(Math.log(input) / Math.log(1000));
return (input / Math.pow(1000, exp)).toFixed(args) + suffixes[exp - 1];
}
}
PS:我确定我在堆栈溢出的某个地方找到了它,但我找不到原来的答案:(
推荐阅读
- javascript - 如何使用从 axios.get 方法驱动的 JSON 数据?
- bash - 如何计算每个文件夹的文件?
- javascript - 8 个字符和 2 位数字的密码验证器不起作用
- reactjs - 属性值可以包含内联样式吗?
- python - 使用循环将列表中的所有条目插入 SQLite 数据库
- node.js - 无法在反应和非节点 js 后端(apache)服务器应用程序中访问进程对象
- .net - AWS SES - 设计如何将传入的电子邮件保存到数据库(SQL Server)
- javascript - 在表格中实时搜索特定列
- sql-server - 在多个where条件中选择具有最大值的行
- wordpress - woocommerce:如何访问数据库中的订单购买