使用RegEx如何从十进制数中删除尾随零

时间:2014-10-10 12:11:31

标签: regex actionscript-3

我需要编写一些带有数字的正则表达式,并删除小数点后的任何尾随零。语言是Actionscript 3.所以我想写:

var result:String = theStringOfTheNumber.replace( [ the regex ], "" );

例如:

3.04000将为3.04

0.456000将是0.456

我花了一些时间查看各种正则表达式网站,我发现这比我最初的想法更难解决。

12 个答案:

答案 0 :(得分:4)

正则表达式:

^(\d+\.\d*?[1-9])0+$

OR

(\.\d*?[1-9])0+$

替换字符串:

$1

DEMO

<强>代码:

var result:String = theStringOfTheNumber.replace(/(\.\d*?[1-9])0+$/g, "$1" );

答案 1 :(得分:4)

如果在\b

之后至少有一位数字,则在. boundary之前删除尾随零怎么样?
(\.\d+?)0+\b

并替换为第一个capture group中捕获的内容。

$1

请参阅test at regexr.com

答案 2 :(得分:3)

(?=.*?\.)(.*?[1-9])(?!.*?\.)(?=0*$)|^.*$

试试这个。抓住捕获。参见演示。

http://regex101.com/r/xE6aD0/11

答案 3 :(得分:1)

其他答案没有考虑没有分数的数字(如 1.000000 )或使用了后视函数(遗憾的是,我正在使用的实现不支持)。所以我修改了现有的答案。

  • 匹配使用 ^-?\d+(\.\d*[1-9])? - Demo(参见匹配)。这不适用于文本中的数字(如句子)。
  • 替换(使用 \1$1)使用 (^-?\d+\.\d*[1-9])(0+$)|(\.0+$) - Demo(参见替换)。如果您删除 ^$,此方法将适用于文本中的数字(如句子)。

两个演示都带有示例。

附注:如果需要,将 \. 替换为您使用的小数点分隔符(, - 不需要斜线),但我建议不要支持多个分隔符此类正则表达式中的格式(如 (\.|,))。内部格式通常使用一个特定的分隔符,如 . 中的 1.135644131(无需检查其他潜在的分隔符),而外部格式倾向于同时使用两者(一种用于小数,一种用于千位,例如 {{1} }),这会使您的正则表达式不可靠。

更新:我在两个正则表达式中都添加了 1.123,541,921 以添加对负数的支持,这在演示中没有。

答案 4 :(得分:0)

试试这个

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

阅读本文 http://www.regular-expressions.info/numericranges.html它可能会有所帮助。

答案 5 :(得分:0)

我知道这不是原始问题所寻求的,但是任何想要格式化钱并且只想删除连续两个尾随零的人,就像这样:

£30.00 => £30
£30.10 => £30.10 (and not £30.1)

30.00€ => 30€
30.10€ => 30.10€

然后你应该能够使用下面的正则表达式,它将识别两个尾随的零,后面没有任何其他数字或存在于字符串的末尾。

([^\d]00)(?=[^\d]|$)

答案 6 :(得分:0)

如果您的正则表达式引擎不支持“环视”功能,那么您可以使用这种简单的方法:

fn:replace("12300400", "([^0])0*$", "$1")

结果将是:123004

答案 7 :(得分:0)

最适合我的是

^([\d,]+)$|^([\d,]+)\.0*$|^([\d,]+\.[0-9]*?)0*$

例如,

s.replace(/^([\d,]+)$|^([\d,]+)\.0*$|^([\d,]+\.[0-9]*?)0*$/, "$1$2$3");

此更改

1.10000 => 1.1
1.100100 => 1.1001
1.000 => 1
1 >= 1

答案 8 :(得分:0)

我参加聚会有点晚了,但这是我的解决方法:

(((?<=(\.|,)\d*?[1-9])0+$)|(\.|,)0+$)

我的正则表达式仅匹配尾随的0,使执行.replaceAll(..)类型的函数变得容易。

打破它,第一部分:((?<=(\.|,)\d*?[1-9])0+$)

  • (?<=(\.|,):正面评价。小数必须包含.,(在某些国家/地区,逗号用作小数点)。但是从后面看,它不包含在匹配的文本中,但仍然必须存在。
  • \d*?:懒惰地匹配任意数量的数字
  • [1-9]:匹配单个非零字符(这是尾随0之前的最后一位)
  • 0+$:匹配最后一个非零数字和行尾之间出现的1个或多个0

除了尾随0立即开始的情况(例如在1.05.000中的情况)之外,这对所有内容都适用。第二部分修复了(\.|,)0+$

  • (\.|,):匹配将包含在匹配文本中的.,
  • 0+$在小数点和行尾之间匹配1个或多个0

示例:

  • 1.0成为1
  • 5.0000成为5
  • 5.02394900022000成为5.02394900022

答案 9 :(得分:0)

我知道我有点晚了,但我认为这可以通过更简单的方式解决。 要么我错过了某些东西,要么其他回复者过于复杂,但我认为有一个更直接但更有弹性的解决方案 RE:

([0-9]*[.]?([0-9]*[1-9]|[0]?))[0]*

通过反向引用第一组 (\1),您可以获得没有尾随零的数字。

它也适用于 .XXXXX... 和 ...XXXXX。键入数字字符串。例如,它会将 .45600 转换为 .456,并将 123. 转换为 123。

更重要的是,它使整数字符串完好无损(没有小数点的数字)。例如,它会将 12300 转换为 12300。

请注意,如果有小数点并且后面只有零,则只会留下一个尾随零。例如,对于 42.0000,您会得到 42.0。

如果你也想消除前导零,那么你使用这个正则(只需在前者的开头放一个 [0]*):

[0]*([0-9]*[.]?([0-9]*[1-9]|[0]?))[0]*

答案 10 :(得分:0)

我从顶部测试了几个答案:

^(\d+\.\d*?[1-9])0+$
(\.\d*?[1-9])0+$
(\.\d+?)0+\b

当“.”后全是零时,所有这些都不起作用。像 45.000450.000

修改版本以匹配该案例:(\.\d*?[1-9]|)\.?0+$ 还需要替换为“$1”,例如:

preg_replace('/(\.\d*?[1-9]|)\.?0+$/', '$1', $value);

答案 11 :(得分:-1)

是否真的有必要使用正则表达式?为什么不检查数字中的最后一位数字?我不熟悉Actionscript 3,但是在python中我会做这样的事情:

decinums = ['1.100', '0.0','1.1','10']
for d in decinums:
    if d.find('.'):
        while d.endswith('0'):
            d = d[:-1]
    if d.endswith('.'):
        d = d[:-1]
    print(d)

结果将是:

1.1
0
1.1
10