2012-01-18 248 views
0

我有一个数组包含价格的字符串,有时包围字符。Javascript从字符串中获取数字?

我该如何转换它?

[0] > '$9.99/aa' 
[1] > '$2.99' 
[2] > '$1.' 

到:

[0] > '9.99' 
[1] > '2.99' 
[2] > '1' 

因此,我可以做的值进行比较?我只需要知道如何改变之一,我可以把它应用到阵列容易

回答

2
+myString.replace(/[^\d.ex-]+/gi, '') 

剔除了不能出现在JavaScript数字的所有字符,然后+操作适用于它,将其转换为数字。如果您没有十六进制格式或指数格式的数字,则可以不使用ex

编辑:

要处理的语言环境,并以更有针对性的方式来处理数字,我会做以下

// Get rid of myriad separators and normalize the fraction separator. 
if ((0.5).toLocaleString().indexOf(',') >= 0) { 
    myString = myString.replace(/\./g, '').replace(/,/g, '.'); 
} else { 
    myString = myString.replace(/,/g, ''); 
} 

var numericValue = +(myString.match(
    // Matches JavaScript number literals excluding octal. 
    /[+-]?(?:(?:(?:0|[1-9]\d*)(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|0x[0-9a-f]+)/i) 
    // Will produce NaN if there's no match. 
    || NaN); 
+1

你的正则表达式非常广泛。 – Hello71 2012-01-18 22:08:44

+0

+1我唯一要补充的是我不认为这个转换(或者任何js中的float转换)都是依赖locale的。只是一个FYI – 2012-01-18 22:10:41

+0

谢谢,但我仍然有一个问题。如果字符串是:“$ 1.99”。我得到“1.99”。有这个简单的解决方案吗? – lisovaccaro 2012-01-18 22:22:38

0

偷懒的方法:

+string; 

的正确方法:

parseInt(string, 10); 

这样:

for (var i = 0; i < arr.length; i++) { 
    var match = /\$(\d*)\.(\d\d)/.exec(arr[i]); 
    arr[i] = parseInt(match[1] + match[2]); 
} 

编辑:哦,你想要超过10美元的东西。

另一编辑:显然parseInt(至少在我的浏览器中)忽略尾随字符。在那种情况下,我的原始实施将会奏效。

for (var i = 0; i < arr.length; i++) { 
    arr[i] = parseInt(arr[i].substring(1)); 
} 
+0

更紧密地阅读问题。 – 2012-01-18 22:02:27

+1

这些都不能与提供的数据一起使用。你只是阅读*标题*,是不是。 – 2012-01-18 22:03:15

+0

@RobW:你指的是循环部分还是别的? – Hello71 2012-01-18 22:03:19

2

你的情况需要一个正则表达式,因为所有的本地转化数量的方法失败当字符串以非数字/点作为前缀时。

var string = '$1.22'; //Example 
string = string.replace(/[^0-9.]+/g, ''); 
// string = '1.22' 

如果你想这个字符串转换为数字,然后,你可以使用parseInt+1*

对于这些转换数目的方法的比较,参见this answer

0
+/[\d\.]+/.exec('$9.99/aa')[0] 

查找的数字和周期中的第一组,将它们转换为浮法

1

parseFloat()适用于这样的情况下,当你需要小数。正则表达式会为0索引中的所有情况提供匹配的数字。示例代码如下。第一个数字之前

var one = "2.99"; 
var two = '$1.'; 
var three = '$3tees'; 
var four = '$44.10'  

var regex = /\d+\.?(\d+)?/; 
var num = parseFloat(one.match(regex)[0]); 
1

地带的一切,并应用到parseFloat其余:

s = "$9.99/aa" 
alert(parseFloat(s.replace(/^\D*/, '')))