React Native 根据条件删除数字字符串中的所有零

2q5ifsrm  于 2023-02-05  发布在  React
关注(0)|答案(6)|浏览(138)

我有一个<input type='number'/>比较。
我如何才能使用onSubmit(或其他选项,我可以自由地提出建议,但我需要它在用户键入时不影响用户,只有在用户完成时才影响用户)来完成以下所有操作?
1.删除所有前导零
1.删除所有结尾零
1.将字符串中的所有零替换为单个零(即所有多个零将转换为单个零,例如10020004将转换为10204
默认情况下,用户将能够输入多少,他将需要,前两个选项将始终是。第三个选项将取决于用户数据(为了这个问题,让我们假设如果first_user设置为真,它将是)
到目前为止,我所尝试的是类似ref.value.replace('/^0+/', '')的东西(使用^0$对我来说效果不好,但条件3我甚至不知道如何实现),它在开始的零上大部分时间都很好,但我没有找到一种方法来处理结尾和所有中间的东西

澄清口渴选项:

基于first_user状态(真或假),它将移除数字串的内部,如果其为真,则所有内部零将被转换为单一,如果其为假,则所有内部零将被转换为双零

bpsygsoo

bpsygsoo1#

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

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

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

rt4zxlrg

rt4zxlrg2#

我想你想多了,要用一个版本的东西替换多个东西,你只需要定位一个或多个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)
v09wglhw

v09wglhw3#

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

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”。如果这没有帮助,请提供更多信息,好吗?希望这会有所帮助。

wfauudbj

wfauudbj4#

你可以试试这个

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

hwazgwia5#

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

bfnvny8b6#

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

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

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

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

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

document.getElementById("inp").addEventListener("change", function () {
    this.value = this.value.replace(/^0+(?=[^0])|(?<=[^0])0+$|(0)0+/g, "$1");
});
<input id="inp" type="number">

<button>Fake submit</button>

相关问题