2012-01-18 247 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*/, '')))