javascript 从数字字符串中删除连续的零[已关闭]

lpwwtiir  于 2023-02-07  发布在  Java
关注(0)|答案(6)|浏览(157)

16小时前关门了。
此帖子在11小时前编辑并提交审查。
Improve this question
我有一个<input type='number'/>元素。
我想对提交事件触发时输入的数字执行转换。它也可以在另一个事件上:我愿意接受建议,但是转换不应该在用户输入时发生,而应该在他们完成输入时发生。
转换应如下所示:
1.删除所有前导零
1.删除所有结尾零
1.用一个或两个零替换所有其他连续的零(根据变量,应该是一个或两个)
例如:01002000400将转换为10204
第三条规则取决于布尔变量first_user:如果为真,则所有内部连续零将转换为一个零,如果为假,则所有内部零将转换为两个零。

尝试

以下是我的尝试:

ref.value.replace('/^0+/', '')

为了同时删除结尾的零,我尝试了^0$,但结果并不理想:没有效果。
我也不知道该怎么执行第三条规则。
我怎样才能做到这一点?

uxh89sit

uxh89sit1#

您可以通过一个replace调用来完成此操作。可以按以下顺序检查这三种情况:

  • 字符串开头为零
  • 字符串末尾为零
  • 在其他位置为零(多于一个):捕获捕获组中的第一个零

作为替换,输出由捕获组捕获的字符串。由于该组仅在第三种情况发生时捕获一个零,这实际上意味着所有其他零都将被删除。
我认为当数字正好为0时,必须引入该规则的一个例外。我猜您希望保留单个零。为了实现这一点,我将对前两个规则进行如下限制:

  • 字符串后面跟一个非零值时,字符串开头为零
  • 跟在非零字符串后面时,字符串末尾为零
  • 在其他位置为零(多于一个):捕获捕获组中的第一个零

第三种情况现在也适用于输入仅由零组成的情况。
您可以使用submit事件,但使用change事件可能也会很有趣:它不会在用户键入时触发,但会在用户"提交"值时触发,即当焦点移动到另一个元素、或选择另一个选项卡/窗口、或在输入小部件上使用向上/向下控件、或提交表单时...

const inputDouble = document.getElementById("double")
const input = document.getElementById("inp");

document.addEventListener("change", function () {
    const regex = inputDouble.checked
          ? /^0+(?=[^0])|(?<=[^0])0+$|(00)0+/g
          : /^0+(?=[^0])|(?<=[^0])0+$|(0)0+/g
    input.value = input.value.replace(regex, "$1");
});
<input id="double" type="checkbox"> Double zeroes<br>
Number to clean: <input id="inp" type="number"><br>

<button>Fake submit</button>
fwzugrvs

fwzugrvs2#

一个好的解决方案是实现一个简单的算法来完成你所需要的。

  • 从第一个位置(0)开始,直到找到一个非零数字;
  • 从最后一个位置向后移动(string.length-1),直到找到一个非零的数字;
  • 遍历上述修改后的字符串,然后:如果当前数字是非零的,则用它创建新字符串,如果当前数字是零而先前数字不是零,则将其包括在新字符串中,如果先前数字是零,则忽略它。

这应该是一个非常简单的方法,并且比正则表达式更好用。对于onSubmit触发器,我认为它会工作得很好。我会使用onChange并将其存储在一个隐藏字段中,但我认为onSubmit会起到作用

23c0lvtd

23c0lvtd3#

我想你想多了,要用一个版本的东西替换多个东西,你只需要定位一个或多个things,然后在replace函数中,用一个thing替换
实际上并不需要指定开头或结尾,只需要指定一个或多个0,然后替换为一个0即可
试试这个:

const singleZeros = '10020004'.replace(/(0+)/g, '0')

console.log(singleZeros);

对于删除前导和尾随0的,可能有一个更好的方法,但在我的脑海中,这是我会做的:

const removeStart = (s) => s.startsWith('0') ? s.slice(1) : s;
const removeEnd = (s) => s.endsWith('0') ? s.slice(0, s.length - 1) : s;

const zerosOnEnds = '0102040'

const zerosTrimmed = removeEnd(removeStart(zerosOnEnds));

console.log(zerosTrimmed)
eoigrqb6

eoigrqb64#

也许一个简单的解决方案是创建一个在提交时运行的转换函数。

answer = 10020004
function transform(answer){

    final_answ = ''
    index = 0
    zero_index = -2
    while(index<answer.toString().length){
      if (answer.toString()[index] !== '0'){
        final_answ += answer.toString()[index]
      } else if (index === zero_index+1){
        zero_index = index
      } else {
        final_answ += answer.toString()[index]
        zero_index = index
      }
      index++
    }
}

将用户响应转换为字符串还可以使您更容易地删除开始和结束“0”。如果这没有帮助,请提供更多信息,好吗?希望这会有所帮助。

ds97pgxw

ds97pgxw5#

你可以试试这个

let str = '001002000400'
str = str.replace(/^0*(\d+?)0*$/, (matchs, p1) => { 
  return p1.replaceAll(/([^0]+)0+/g,'$10')
})
console.log(str); //10204
gkn4icbw

gkn4icbw6#

  • 从你的帖子来看,你所需要的只是一个正则表达式,用空字符串替换第一个零,如果中间的其他零大于1,就替换它们,只保留一个
  • 你需要什么在你的代码中,你使用的第一件事是字符串'/^0+/',这不是使用正则表达式的真正方法,你应该删除字符串引号,并把你的正则表达式写在正斜杠/内,就像/regex/一样
  • 第二:在需要g修饰符的情况下,需要使用regex修饰符
  • 有关regex的更多信息,您可以查看一些教程,如that或快速参考,如w3schools参考
  • 这是正则表达式
//Result: 104057
console.log("0100400057".replace(/^0|(0)+(?=0)/g, ""))

相关问题