2012-05-16 58 views
5

我很难形成一个正则表达式,它可以从表示为字符串的数字中去掉前导零。对不起,但parseFloat不是我正在寻找的,因为我将处理具有30+小数位的数字。使用正则表达式来形成一个没有前导零的数字

我现在的正则表达式是

/(?!-)?(0+)/; 

这里是我的测试案例。 http://jsfiddle.net/j9mxd/1/

$(function() { 
    var r = function(val){ 
     var re = /(?!-)?(0+)/; 
     return val.toString().replace(re, ''); 
    }; 
    test("positive", function() { 
     equal(r("000.01"), "0.01"); 
     equal(r("00.1"), "0.1"); 
     equal(r("010.01"), "10.01"); 
     equal(r("0010"), "10"); 
     equal(r("0010.0"), "10.0"); 
     equal(r("10010.0"), "10010.0"); 
    }); 
    test("negative", function() { 
     equal(r("-000.01"), "-0.01"); 
     equal(r("-00.1"), "-0.1"); 
     equal(r("-010.01"), "-10.01"); 
     equal(r("-0010"), "-10"); 
     equal(r("-0010.0"), "-10.0"); 
     equal(r("-10010.0"), "-10010.0");   
    }); 
}); 

为什么我的测试用例没有通过?

+0

请提供什么是真正走错了,并要求一个实际的问题可能不会伤害或者一些见解。 –

+0

问题是“为什么我的测试不通过?” –

+0

所有这些?好的...... –

回答

4

这就完成所有的情况下

var re = /^(-)?0+(?=\d)/; 
return val.toString().replace(re, '$1'); 

^对字符串的开头匹配。

(-)?匹配可选的-这将重新插入替换字符串中。

(0+)(?=\d)匹配一系列0后跟一个数字。 (?=\d)lookahead assertion,它不匹配,但确保数字跟在前导零后面。

+0

什么?=意思? –

+0

@LarryBattle我添加了一个解释 – stema

1

您可以使用下列内容:

var r = function(val) { 
    var re = /(-)?0*(\d.*)/; 
    var matches = val.toString().match(re); 
    return (matches[1] || '') + matches[2]; 
}; 
2

这通过你的测试,并且相对容易阅读:

var r = function(val){ 
    var re = /^(-?)(0+)(0\.|[1-9])/; 
    return val.toString().replace(re, '$1$3'); 
}; 
+0

非常聪明的使用反向引用。 –

+0

向前看是一个更好的解决方案 - 我会编辑答案,但stema先提出。 – AD7six

相关问题