2014-02-25 64 views
0

我試圖將數字格式化爲巴西貨幣,但我不確定發生了什麼問題。使用正則表達式格式化數字

function format2(n, currency) { 
    return currency + " " + n.toFixed(2).replace(^\s*(?:[1-9]\d{0,2}(?:\.\d{3})*|0)(?:,\d{1,2})?$/g, "$1,"); 
} 
+4

您可以提供樣本輸入/輸出嗎? –

+0

R $ 123.456.789,10多數民衆贊成如此它應該是..我讀這個正則表達式會工作,但它給我一個語法錯誤.. – ledesma

+0

舉例說明你實際傳遞給'format2()' –

回答

1
Taken from the comments: 「but its giving me a syntax error..」 

你缺少一個斜槓來定義一個正則表達式文字。更改您的返回語句爲

return currency + " " + n.toFixed(2).replace(/^\s*(?:[1-9]\d{0,2}(?:\.\d{3})*|0)(?:,\d{1,2})?$/g, "$1,"); 
              ^Teda, the magic opening slash! 

順便說一句,你的正則表達式太複雜IMO並沒有正確格式化。我只想做/\./g得到匹配的時間,讓你的REPLACE語句看起來像.replace(/\./g, ",");

Demo

+0

但它的格式不正確,因爲它應該... R $ 1.234,00 – ledesma

+0

@GilbertoGonçalvesMachado什麼是',00'?何時發生?我不太瞭解巴西貨幣格式 – Cilan

+0

我明白了..解決了這個問題..但是現在我有另一個問題是不格式化數字.. – ledesma

0

我不知道爲什麼你這麼熱衷於使用正則表達式這一點。以下循環解決方案應該很好,並提供更一般的解決方案:

function formatNumber(num, places, thou, point) { 
    var result = []; 
    num = Number(num).toFixed(places).split('.'); 
    var m = num[0]; 

    for (var s=m.length%3, i=s?0:1, iLen=m.length/3|0; i<=iLen; i++) { 
    result.push(m.substr(i? (i-1)*3+s : 0, i? 3 : s)); 
    } 
    return result.join(thou) + point + num[1]; 
} 

console.log('R$ ' + formatNumber(12345678.155, 2, '.', ',')); // R$ 12.345.678,16 
console.log('R$ ' + formatNumber(12.155, 2, '.', ','));  // R$ 12,16 
相關問題