Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
模板字符串中的数字格式(Javascript-ES6)_Javascript_String Formatting_Ecmascript 6_Template Strings - Fatal编程技术网

模板字符串中的数字格式(Javascript-ES6)

模板字符串中的数字格式(Javascript-ES6),javascript,string-formatting,ecmascript-6,template-strings,Javascript,String Formatting,Ecmascript 6,Template Strings,我想知道是否可以在Javascript模板字符串中格式化数字,例如: var n = 5.1234; console.log(`This is a number: $.2d{n}`); // -> 5.12 或者可能 var n = 5.1234; console.log(`This is a number: ${n.toString('.2d')}`); // -> 5.12 这种语法显然不起作用,它只是我正在寻找的类型的一个例子 我从下划线.string中了解到类似sprin

我想知道是否可以在Javascript模板字符串中格式化数字,例如:

var n = 5.1234;
console.log(`This is a number: $.2d{n}`);
// -> 5.12
或者可能

var n = 5.1234;
console.log(`This is a number: ${n.toString('.2d')}`);
// -> 5.12
这种语法显然不起作用,它只是我正在寻找的类型的一个例子

我从
下划线.string
中了解到类似
sprintf
的工具,但这似乎是JS应该能够完成的事情,特别是考虑到模板字符串的强大功能

编辑


如上所述,我已经知道第三方工具(如sprintf)和定制功能可以实现这一点。类似的问题(例如)根本就没有提到模板字符串,可能是因为它们是在ES6模板字符串出现之前提出的。我的问题是针对ES6的,与实现无关。如果是这样的话,我很乐意接受“不,这是不可能的”的回答,但最好是提供有关提供此功能的新ES6功能的信息,或者了解此类功能是否正在开发中。

您应该能够使用数字的toFixed()方法:

var num = 5.1234;
var n = num.toFixed(2); 

不,ES6没有引入任何新的数字格式功能,您将不得不使用现有的、和(但已更新为可选地支持)。
模板字符串与数字格式没有任何关系,它们只是将其解压缩到函数调用(如果已标记)或字符串连接(默认)


如果这些
Number
方法对您来说还不够,您将不得不使用自己的方法。当然,如果愿意,您可以将格式化函数编写为模板字符串标记。

您可以使用es6标记函数。我不知道你准备好了吗

可能是这样的:

num`This is a number: $.2d{n}`
了解更多信息:


如果您想使用ES6标记函数,下面是此类标记函数的外观

function d2(pieces) {
    var result = pieces[0];
    var substitutions = [].slice.call(arguments, 1);

    for (var i = 0; i < substitutions.length; ++i) {
        var n = substitutions[i];

        if (Number(n) == n) {
            result += Number(substitutions[i]).toFixed(2);
        } else {
            result += substitutions[i];
        }

        result += pieces[i + 1];
    }

    return result;
}

这将格式化浮点,而不使用字符串

虽然使用模板字符串插值进行格式化作为内置功能不可用,但您可以通过以下方式获得等效行为:

请注意,无论您选择何种实现,您都可能会被舍入错误所困扰:

(9.999).toFixed(2) // -> '10.00'

new Intl.NumberFormat([], {
  minimumFractionDigits: 2,
  maximumFractionDigits: 2, // <- implicit rounding!
}).format(9.999) // -> '10.00'
(9.999).toFixed(2)/->“10.00”
新的国际编号格式([]{
最小分数位数:2,
最大分数位数:2,//“10.00”

这是上面Filip Allberg解决方案的完整ES6版本,使用ES6“rest”参数。唯一缺少的是能够改变精度;这可以通过制作工厂函数来实现。留给读者作为练习

函数d2(strs,…args){
var结果=strs[0];
对于(变量i=0;ilog(d2`template:${f}${f*100}和${s}(literal:${9.0001})`)
这在Adobe JavaScript中是可能的。
util.printf
否则我们必须等到ECMAScript 6可用…@WhiteHat-检查您的日历是的,但我在哪里可以使用它?IE 9是我工作的标准问题,只是有点抱怨。这首先给了我一个语法错误,num没有定义,如果我删除它也不起作用从一开始就是“num”。这里有任何详细信息吗?一个完全有效的示例会很好。MDN链接确实很好地解释了这一点。很好!这应该是公认的答案。下面是一个带有“rest”参数的完整ES6版本:
const format = (num, fraction = 2) => new Intl.NumberFormat([], {
  minimumFractionDigits: fraction,
  maximumFractionDigits: fraction,
}).format(num);

format(5.1234); // -> '5.12'
(9.999).toFixed(2) // -> '10.00'

new Intl.NumberFormat([], {
  minimumFractionDigits: 2,
  maximumFractionDigits: 2, // <- implicit rounding!
}).format(9.999) // -> '10.00'