我正在尝试格式化一个以更友好的方式显示的数字。目前,代码很难更新,而且非常庞大且笨拙。
function abb(){
if(m>=1 && m<999){
gold_display = m;
}else if(m>999 && m<999999){
var b = (m / 1000).toFixed(3);
gold_display = b+"k";
}else if (m>999999 && m<999999999){
var b = (m / 1000000).toFixed(3);
gold_display = b+"m";
}else if (m>999999999 && m<999999999999){
var b = (m / 1000000000).toFixed(3);
gold_display = b+"b";
}else if (m>999999999999 && m<99999999999999){
var b = (m / 1000000000000).toFixed(3);
gold_display = b+"t";
}
}
编辑:这将成为代码:
function abb(){
if(m>=1 && m<1000){
gold_display = m;
}else if(m>999 && m<1000000){
var b = (m / 1000).toFixed(3);
gold_display = b+"k";
}else if (m>999999 && m<1000000000){
var b = (m / 1000000).toFixed(3);
gold_display = b+"m";
}else if (m>999999999 && m<1000000000000){
var b = (m / 1000000000).toFixed(3);
gold_display = b+"b";
}else if (m>999999999999 && m<100000000000000){
var b = (m / 1000000000000).toFixed(3);
gold_display = b+"t";
}
}
是的,这是令人讨厌的,但它是我脑海中唯一的解决方案,有没有办法将其转换为循环并缩小代码?
我正在考虑将数字“k”,“m”,“b”,“t”保存在数组中,因为我想要更高的“q”,“qi”,“s”等。
如果问题有点愚蠢,谢谢,对不起:(
答案 0 :(得分:2)
在1000
function bigNumber(big) {
let divisor = 1,
steps = 0,
small = big;
while (small >= 1000) {
divisor *= 1000;
small = big / divisor;
++steps;
}
return {steps, divisor, small};
}
let gold = 123456789,
foo = bigNumber(gold);
foo.small.toFixed(3) + ['', 'k', 'm', 'b', 't'][foo.steps];
// "123.457m"
次的次数
if else
答案 1 :(得分:1)
这并不多,但是代码的一个简化就是消除下限检查,因为if / else-if结构会处理这个:
function abb(m) {
if (m < 1) {
// some kind of error?
} else if (m < 1000) {
return m;
} else if (m < 1000000) {
return (m/1000).toFixed(3) + "k";
} else if (m < 1000000000) {
return (m/1000000).toFixed(3) + "m";
} else {
// and so on
}
}
你可以做一些更聪明的事情,但我认为最好是简单一点。
但是,如果我正确理解你的代码,那么你试图将数字格式化为数千(“k”),数百万(“m”),数十亿(“b”)等等。为什么不看一个这样的库作为http://numeraljs.com/?
具体来说,您可以使用以下代码:
var numeral = require('numeral').language('en');
导入numeral.js库,然后使用此代码执行格式化:
var str = numeral(12345678).format("0.0a");// "12.3m"
var str = numeral(1234).format("0.0a");// "1.2k"
等
答案 2 :(得分:1)
完全公开:这个解决方案带来了for for循环的好处,但确实有一些额外的复杂性。
取m
的对数。如果1 <= m< 999
则0 <= exponent < 3
。同样,如果是1000 <= m < 999999
,那么3 <= exponent < 6
,依此类推。你可以在这里看到模式,每个前缀在对数刻度上覆盖3的范围。所以你可以做类似以下的事情:
function abb(m){
var prefixes = ["","k","m","b","t"];
var log = Math.log10(m);
var prefixRange = parseInt(log/3, 10);
var prefix = prefixes[prefixRange];
return (m / Math.pow(1000, prefixRange)).toFixed(3) + prefix;
}
实际上,在数字非常大的情况下,上述内容会中断,因此需要将prefixRange = parseInt(log/3, 10)
更改为prefixRange = Math.min(parseInt(log/3, 10), 4)
,以确保我们不会读取超出数组{{1}的长度}}。
另外,请注意,在这种情况下,对于大数字,toFixed实际上并不值得信任。 prefixes
给出了999999999 / 1000000
,我想这不是你想要的。在这种情况下,最好与地板一起使用。由于您只对第一个数字感兴趣(整数为3,小数部分为3),您可以先获得这6个数字然后除以1000。
解决这两个问题的更好的功能是:
1000.000