我需要编写一些带有数字的正则表达式,并删除小数点后的任何尾随零。语言是Actionscript 3.所以我想写:
var result:String = theStringOfTheNumber.replace( [ the regex ], "" );
例如:
3.04000
将为3.04
0.456000
将是0.456
等
我花了一些时间查看各种正则表达式网站,我发现这比我最初的想法更难解决。
答案 0 :(得分:4)
正则表达式:
^(\d+\.\d*?[1-9])0+$
OR
(\.\d*?[1-9])0+$
替换字符串:
$1
<强>代码:强>
var result:String = theStringOfTheNumber.replace(/(\.\d*?[1-9])0+$/g, "$1" );
答案 1 :(得分:4)
答案 2 :(得分:3)
答案 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.0
或5.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.000
或 450.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