【问题标题】:Leading and trailing zeros in numbers数字中的前导零和尾随零
【发布时间】:2019-05-17 23:06:51
【问题描述】:

我正在做一个项目,我需要按以下方式格式化传入的数字:

###.###

但是我注意到了一些我没想到的结果。 在我没有收到错误的意义上,以下工作:

console.log(07);

// or in my case:
console.log(007);

当然,它不会在值本身中保留“00”,因为该值实际上是 7。

以下内容也是如此:

console.log(7.0);

// or in my case:
console.log(7.000);

JavaScript 理解我在做什么,但最终实际值为 7,这可以通过以下方式证明:

    const leadingValue = 007;
    const trailingValue = 7.00;

    console.log(leadingValue, trailingValue); // both are exactly 7

但我觉得奇怪的是:当我将这两者结合起来时,我得到了一个语法错误:

// but not this:
console.log(007.000);

1) 有人可以解释为什么这不起作用吗?

我正在尝试找到一种解决方案,在不使用字符串的情况下以精确的精度存储数字/浮点数。

2) JS/NodeJS 甚至 TypeScript 中是否有任何方法可以在不使用字符串的情况下做到这一点?

我目前想要做的是接收输入,扫描格式并将其存储为单独的属性,然后解析传入的值,因为parseInt('007.000') 确实有效。当用户想要获取这个值时,将它返回给用户......在一个字符串中......不幸的是。

【问题讨论】:

  • "以下作品" 你能解释一下你的意思吗?因为您在输出中没有得到数字 07007。它“工作”的方式是它不会引发错误。而且我不知道你为什么需要写007.000 - 这显然是一个语法错误(TBH,我直到现在才知道)但更重要的是,它没用,因为你是 充其量只会让7出去。
  • As 2) - 你不能转义字符串。 JS 数字只会以 JS 想要的方式表示。它不会捕获您使用的格式,因此 77.07.000 是相同的值。对于我所知道的任何语言都是如此——原语需要单独的格式。
  • 我猜这只会在没有0s 的情况下显示。在内部它仍然是一样的,但为什么不只使用字符串呢?如果你想显示字符串的数字就可以了,如果你做3 * 7.003 * 7等等,计算也没有区别......
  • @VLAZ tbh,我只是在尝试我能做的事情,而不是刚刚遇到这个。我知道最终 7.0 将被视为 7。我正在寻找一种方法来防止将诸如“数量”之类的属性存储为字符串值,因为这对我来说没有意义。

标签: javascript node.js typescript


【解决方案1】:

1) 007.000 是一个语法错误,因为 007 是一个八进制的 integer literal,然后您将在其上附加一个浮点部分。 (试试console.log(010)。这会打印 8。)

2) 以下是使用Intl.NumberFormat 实现格式化的方法...

var myformat = new Intl.NumberFormat('en-US', { 
    minimumIntegerDigits: 3, 
    minimumFractionDigits: 3 
});
console.log(myformat.format(7)); // prints 007.000

【讨论】:

    【解决方案2】:

    您可以使用使用字符串函数 .split .padStart 和 .padEnd 的方法

    在 MDN 上搜索

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padEnd

    这里有一个例子:

    const x = 12.1;
    
    function formatNumber( unformatedNumber) {
      const desiredDecimalPad = 3;
      const desiredNonDecimalPad = 3;
    
      const unformatedNumberString = unformatedNumber.toString();
      const unformatedNumberArr = unformatedNumberString.split('.');
      const decimalStartPadded = unformatedNumberArr[0].padStart(desiredDecimalPad, '0');
      const nonDecimalEndPadded = unformatedNumberArr[1].padEnd(desiredNonDecimalPad, '0');
      const formatedNumberString = decimalStartPadded + '.' + nonDecimalEndPadded;
    
      return formatedNumberString;
    }
    
    
    console.log(formatNumber(x))

    【讨论】:

    • 此函数将返回一个字符串,您可以在前端使用该字符串以显示格式化的变量。您不需要保存在后端格式化的数字(我认为...)
    猜你喜欢
    • 1970-01-01
    • 2014-08-09
    • 2022-10-14
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多