【问题标题】:Regular expression for decimals小数的正则表达式
【发布时间】:2017-06-05 10:24:34
【问题描述】:

各位专家, 我有一个要求,我认为正则表达式可能有助于减少代码中的大量 if 语句和条件。 我的要求是这样的 我有一个显示在 UI(JavaScript)中的数量字段,它有一个从后端发送的控制因子(基于数量字段的测量单位)。

例如我的数量 = "126.768" 控制因子D=“2”(表示小数点后的显示位数为2)。

现在我需要一个正则表达式来查找以下内容

Regex1 应该检查数量是否有任何小数点。如果是这样,那么它应该检查小数点后的值是否不仅仅是零(例如,有时数量没有被格式化为小数点的全长 145.000,在我们的例子中,它应该在 UI 中显示为 145 和控制因子 D不需要考虑)。 RegEx 还应考虑诸如“.590”“.001”等数量值。

由于我是 RegEx 的新手,所以我很难想出一个表达方式

我设法制作了一个非常基本的正则表达式,只检查“。”在“。”之后的数量和所有值内。 正则表达式 = /[.]\d*/g

如果 RegEx1 返回一个肯定的结果。然后 Regex2 现在应该检查值 D。它应该根据 D 调整小数点。例如,如果 D = 3 并且数量 = 345.26,那么正则表达式 2 的输出应该给出 345.260,同样是 D = 1,那么数量应该是 345.3(不知道是否可以使用 RegEx 进行舍入,没有舍入的解决方案也可以)。

问候, 宾斯

【问题讨论】:

  • 一般来说,使用正则表达式来操作和格式化数字是个坏主意。

标签: javascript regex regex-group


【解决方案1】:

第一个正则表达式是

"\d*\.\d*[1-9]\d*"

它在点之后搜索至少 1 个非零数字。

对于第二点,只有当数字超过控制因素时,您才能使用正则表达式进行舍入,而对于 0 填充,您不能使用正则表达式:

function round(num, control) {
  var intPart = num.split(".")[0];
  var decPart = num.split(".")[1];
  decPart = decPart.substring(0, control);		//this does the truncation
  var padding = "0".repeat(control - decPart.length);	//this does the 0-padding
  return intPart + "." + decPart + padding;
}

var num1 = "210.012";
var num2 = "210.1";
var control = 2;
console.log(round(num1, control));
console.log(round(num2, control));

【讨论】:

  • 非常感谢您的回答:),我将这些数量显示为字符串,这是 UI 中的只读字段。所以你的解决方案将适合我的场景。
  • 您正在重新实现一个标准且经过良好测试的本机方法。此实现不会四舍五入到最接近的小数:round('123.256', 2); // expected("123.26") but got("123.25")。我建议你这样做:function round(num, decimals) { return Number(num).toFixed(decimals) }
【解决方案2】:

您不需要任何检查或正则表达式, 有一个Number.prototype.toFixed 方法可以帮助您调整小数。

它基本上将number 舍入到最接近的decimal point 并返回一个字符串。如果您正在使用字符串,请确保在之前进行转换(静态使用 Number

console.log(17.1234.toFixed(2)); // round it down
console.log(17.1264.toFixed(2)); // round it up
console.log(17..toFixed(2)); // Integer
console.log(Number("126.768").toFixed(2)); // from string casting

【讨论】:

  • 我认为 OP 与字符串有关,而不是数字,否则他不会要求使用正则表达式。
  • Number("126.768").toFixed(2) 这应该有助于处理字符串...
  • @horcrux 但他处理的字符串代表数字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多