如何将数字转换为具有特定长度和 k、m、b 的智能数字
Posted
技术标签:
【中文标题】如何将数字转换为具有特定长度和 k、m、b 的智能数字【英文标题】:howto convert a number to a clever number with specific length and k, m, b 【发布时间】:2014-06-18 09:16:24 【问题描述】:例如我有这个号码:
1,234,567.89
我想将此数字转换为具有特定长度的数字,如下所示:
1M
01M
1.2M
1.23M
1.234M
1.2346M
1.23457M
1,234,568
01,234,568
1,234,567.9
1,234,567.89
是否有任何 javascript 函数、插件或以这种方式执行此操作的东西(使用 K、M、B...)?
【问题讨论】:
【参考方案1】:我不明白您的反对意见,因为这不是一个重复的问题,我没有发现任何类似的问题。所以我自己做了它并且它有效;)
function number(num, size)
var s = num;
var l1 = s.toString().length;
if (l1 > size && num > 1) s = Math.floor(num);
var l2 = s.toString().length;
if (l2 > size)
if (num >= 1e3 && num < 1e6)
s = num / 1e3;
var m = Math.max(0, size - 2 - (s.toString().split('.')[0] || num).length);
s = ((m == 0) ? Math.floor(s) : s.toFixed(m)) + 'k';
else if (num >= 1e6 && num < 1e9)
s = num / 1e6;
var m = Math.max(0, size - 2 - (s.toString().split('.')[0] || num).length);
s = ((m == 0) ? Math.floor(s) : s.toFixed(m)) + 'M';
else if (num >= 1e9 && num < 1e12)
s = num / 1e9;
var m = Math.max(0, size - 2 - (s.toString().split('.')[0] || num).length);
s = ((m == 0) ? Math.floor(s) : s.toFixed(m)) + 'G';
else if (num >= 1e12 && num < 1e15)
s = num / 1e12;
var m = Math.max(0, size - 2 - (s.toString().split('.')[0] || num).length);
s = ((m == 0) ? Math.floor(s) : s.toFixed(m)) + 'T';
else if (num >= 1e15 && num < 1e18)
s = num / 1e18;
var m = Math.max(0, size - 2 - (s.toString().split('.')[0] || num).length);
s = ((m == 0) ? Math.floor(s) : s.toFixed(m)) + 'P';
else if (num >= 1e18 && num < 1e21)
s = num / 1e18;
var m = Math.max(0, size - 2 - (s.toString().split('.')[0] || num).length);
s = ((m == 0) ? Math.floor(s) : s.toFixed(m)) + 'E';
else if (num >= 1e21 && num < 1e24)
s = num / 1e21;
var m = Math.max(0, size - 2 - (s.toString().split('.')[0] || num).length);
s = ((m == 0) ? Math.floor(s) : s.toFixed(m)) + 'Z';
else if (num >= 1e24 && num < 1e27)
s = num / 1e24;
var m = Math.max(0, size - 2 - (s.toString().split('.')[0] || num).length);
s = ((m == 0) ? Math.floor(s) : s.toFixed(m)) + 'Y';
var l3 = s.toString().length;
if (l3 > size) s = '-';
var s = s.toString();
while (s.length < size) s = s.charAt(0) == '-' ? '-' + s : '0' + s;
var startZeros = /^(0)\1+/.exec(s),
startZerosCount = (startZeros != null) ? startZeros[0].length : 0,
decimalCount = (num.toString().split('.')[1] || []).length;
if (startZerosCount >= 2 && decimalCount > 0 && s.indexOf('.') < 0)
var decimals = num.toString().split('.')[1],
movedDigits = Math.min(startZerosCount, decimalCount),
lastChar = s.substring(s.length - 1);
if (isNaN(lastChar))
s = s.substring(0, s.length - 1);
s = s.substring(movedDigits) + '.' + decimals.substring(0, movedDigits - 1);
s += lastChar;
else
s = s.substring(movedDigits) + '.' + decimals.substring(0, movedDigits - 1);
return s;
784432432.9999 的输出是:
-
--
---
784M
0784M
784.4M
784.43M
784.432M
784432432
0784432432
【讨论】:
以上是关于如何将数字转换为具有特定长度和 k、m、b 的智能数字的主要内容,如果未能解决你的问题,请参考以下文章
使用 PHP 将数字缩写(5.2k、1.7m 等)转换为有效整数