regex 从字符串中删除多余的零

cigdeys3  于 2023-11-20  发布在  其他
关注(0)|答案(7)|浏览(155)

我知道从字符串中删除前导零的方法:

'000100'.replace(/^0+/, '')

字符串
但是如果一个浮点型字符串(如'00100.2300'或'00100'),如何从它里面去掉所有多余的零呢?

'00100.2300' => '100.23'  
'00100' => '100'  
'00100.0023' => '100.0023'
'100.00' => '100.' or '100' will better
'-100.002300' => '-100.0023'
'0.50' => '0.5'


假设字符串:

  • 仅包含数字或点号或负号'-',不包含字符及其他。
  • 小数点不会出现在字串的第一个,而且最多一个。
  • 负号“-”将出现在正常位置。“-”前后没有多余的零。
  • 字符串表示的浮点数可能大于Number.MAX_SAFE_INTEGER
  • 正负浮动都是可能的。

用于过滤多余零的函数可能相对容易,而且步骤也更多。
而正则表达式会更简单。

7cjasjjr

7cjasjjr1#

Regex:

^0+(?!\.)|(?:\.|(\..*?))0+$

字符串
Live demo
细分:

  • ^0+(?!\.)匹配不符合小数点的前导零
  • |
  • (?:非捕获组的开始
  • \.匹配小数点
  • |
  • (\..*?)捕获小数点前的数字
  • ) NCG结束
  • 0*$匹配尾随零

JS代码:

var str = `00100.2300
00100
00100.0023
100.00
100.
00.50
0.5`;

console.log(
  str.replace(/^0+(?!\.)|(?:\.|(\..*?))0+$/gm, '$1')
)

v440hwme

v440hwme2#

在我看来,您可以执行一次查找和替换操作来完成
一切.
这样,您可以一次匹配整个 valid 数字,从而可以
在一个字符串中修复多个数字(如果全局执行)。
如果您的字串包含单一数字,也会有相同的效果。
查找(?:(-)(?![0.]+(?![\d.]))|-)?\d*?([1-9]\d*|0)(?:(?:(\.\d*[1-9])|\.)\d*)?(?![\d.])
替换$1$2$3
JS演示:https://regex101.com/r/H44t6z/1
可读/信息版本

# Add behind boundary check here
 # -----------------
 (?:
      ( - )                         # (1), Preserve sign -
      (?!                           # Only if not a zero value ahead
           [0.]+ 
           (?! [\d.] )
      )
   |                              # or
      -                             # Match sign, but dump it
 )?
 \d*?                          # Dump leading 0's
 (                             # (2 start), Preserve whole number 
      [1-9]                         # First non-0 number
      \d*                           # Any number
   |                              # or
      0                             # Just last 0 before decimal
 )                             # (2 end)
 (?:                           # Optional fraction part
      (?:                           # -------------
           (                             # (3 start), Preserve decimal and fraction
                \.                            # Decimal
                \d*                           # Any number
                [1-9]                         # Last non-0 number
           )                             # (3 end)
        |                              # or
           \.                            # Match decimal, but dump it
      )                             # -------------
      \d*                           # Dump trailing 0's
 )?
 (?! [\d.] )                   # No digits or dot ahead

字符串

s4n0splo

s4n0splo3#

你可以尝试一个原生方法:

parseFloat("000100.2300")

字符串
然后你可以用任何你想要的方法把它转换回字符串。

lg40wkob

lg40wkob4#

你可以使用^0+来捕获前导零,(\.\d*[1-9])(0+)$来捕获尾随零。所以你的正则表达式应该是:/^0+|(\.\d*[1-9])(0+)$/g

var res = '00100.2300'.replace(/^0+|(\.\d*[1-9])(0+)$/g, '$1');
console.log(res);
var res2 = '100'.replace(/^0+|(\.\d*[1-9])(0+)$/g, '$1');
console.log(res2);

字符串

d4so4syb

d4so4syb5#

即使传递了字符串100,这个答案也可以解决任务:

'00100.002300'.replace(/^0+|(\.0*\d+[^0]+)0+$/g, '$1')

字符串
100.0023

'00100'.replace(/^0+|(\.0*\d+[^0]+)0+$/g, '$1')


100

tkqqtvp1

tkqqtvp16#

在这里使用JS类型强制转换可能是一个好主意。

var trim = s => +s+'',
    strs = ['00100.2300','00100','00100.0023','100.0023'],
    res  = strs.map(trim);
console.log(res);

字符串

q43xntqr

q43xntqr7#

我有一个字符串类型的浮点数,为了比较来自两个不同来源的数据,我只需要从数字中删除尾随的零。
使用正则表达式似乎更容易出错,使用一个简单的while循环检查最后一个字符是否为零对我来说似乎是一次性脚本的一个足够的检查。

// Conversion example: "2.450" to "2.45"
// "3.200" to "3.2"
    function removeTrailingZero(percentage) {
      let ret = percentage;
    
      while (ret.charAt(ret.length - 1) === '0' || ret.charAt(ret.length - 1) === '.') {
        ret = ret.slice(0, -1);
      }
      return ret;
    }

字符串

相关问题