JavaScript 将长数字转换为缩写字符串,有特殊的短小要求

新手上路,请多包涵

在 JavaScript 中,如何编写一个函数将给定的 [edit: positive integer ] 数字(低于 1000 亿)转换为 3 个字母的缩写——其中 0-9 和 az/AZ 算作一个字母,但点(因为它在许多比例字体中是如此之小)不会,并且会在字母限制方面被忽略?

这个问题与 这个有用的线程 有关,但不一样;例如,该函数将变成例如“123456 -> 1.23k”(“123.5k”是 5 个字母)我正在寻找可以执行“123456 -> 0.1m”(“0[.]1m”是 3 个字母)的东西).例如,这将是希望函数的输出(左为原始值,右为理想返回值):

 0                      "0"
12                    "12"
123                  "123"
1234                "1.2k"
12345                "12k"
123456              "0.1m"
1234567             "1.2m"
12345678             "12m"
123456789           "0.1b"
1234567899          "1.2b"
12345678999          "12b"

谢谢!

更新:谢谢!当进行以下修改时,答案就在其中并按照要求工作:

 function abbreviateNumber(value) {
    var newValue = value;
    if (value >= 1000) {
        var suffixes = ["", "k", "m", "b","t"];
        var suffixNum = Math.floor( (""+value).length/3 );
        var shortValue = '';
        for (var precision = 2; precision >= 1; precision--) {
            shortValue = parseFloat( (suffixNum != 0 ? (value / Math.pow(1000,suffixNum) ) : value).toPrecision(precision));
            var dotLessShortValue = (shortValue + '').replace(/[^a-zA-Z 0-9]+/g,'');
            if (dotLessShortValue.length <= 2) { break; }
        }
        if (shortValue % 1 != 0)  shortValue = shortValue.toFixed(1);
        newValue = shortValue+suffixes[suffixNum];
    }
    return newValue;
}

原文由 Philipp Lenssen 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 678
2 个回答

我相信 ninjagecko 的解决方案不太符合您想要的标准。以下函数的作用是:

 function intToString (value) {
    var suffixes = ["", "k", "m", "b","t"];
    var suffixNum = Math.floor((""+value).length/3);
    var shortValue = parseFloat((suffixNum != 0 ? (value / Math.pow(1000,suffixNum)) : value).toPrecision(2));
    if (shortValue % 1 != 0) {
        shortValue = shortValue.toFixed(1);
    }
    return shortValue+suffixes[suffixNum];
}

对于大于 99 万亿的值,将不会添加任何字母,这可以通过附加到“后缀”数组来轻松修复。

Philipp 编辑如下: 通过以下更改,它完全符合所有要求!

 function abbreviateNumber(value) {
    var newValue = value;
    if (value >= 1000) {
        var suffixes = ["", "k", "m", "b","t"];
        var suffixNum = Math.floor( (""+value).length/3 );
        var shortValue = '';
        for (var precision = 2; precision >= 1; precision--) {
            shortValue = parseFloat( (suffixNum != 0 ? (value / Math.pow(1000,suffixNum) ) : value).toPrecision(precision));
            var dotLessShortValue = (shortValue + '').replace(/[^a-zA-Z 0-9]+/g,'');
            if (dotLessShortValue.length <= 2) { break; }
        }
        if (shortValue % 1 != 0)  shortValue = shortValue.toFixed(1);
        newValue = shortValue+suffixes[suffixNum];
    }
    return newValue;
}

原文由 chucktator 发布,翻译遵循 CC BY-SA 4.0 许可协议

方法一:内置库

我建议使用 Javascript 的内置库方法 Intl.NumberFormat

 Intl.NumberFormat('en-US', {
  notation: "compact",
  maximumFractionDigits: 1
}).format(2500);

方法 2:没有图书馆

But you can also create these abbreviations with simple if statements, and without the complexity of Math , maps , regex , for 循环等

用 K 格式化现金价值

const formatCash = n => {
  if (n < 1e3) return n;
  if (n >= 1e3) return +(n / 1e3).toFixed(1) + "K";
};

console.log(formatCash(2500));

使用 KMBT 格式化现金值

const formatCash = n => {
  if (n < 1e3) return n;
  if (n >= 1e3 && n < 1e6) return +(n / 1e3).toFixed(1) + "K";
  if (n >= 1e6 && n < 1e9) return +(n / 1e6).toFixed(1) + "M";
  if (n >= 1e9 && n < 1e12) return +(n / 1e9).toFixed(1) + "B";
  if (n >= 1e12) return +(n / 1e12).toFixed(1) + "T";
};

console.log(formatCash(1235000));

使用负数

let format;
const number = -1235000;

if (number < 0) {
  format = '-' + formatCash(-1 * number);
} else {
  format = formatCash(number);
}

原文由 tim-montague 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题