2016-11-03 56 views
0

我有以這種方式提供的API數774317,我必須將它轉換爲這個值774'317.00,所以如果有2個更多的小數,他們應該像這樣的句號分開使用撇號格式的數字作爲千位分隔符

77431745 => 774'317.45 

按照這個答案https://stackoverflow.com/a/2901298/3918577我讓分隔千(所以它格式化這個774'317),但最後2位小數的問題對我來說,因爲我不是很好的RegEX.Below是代碼我用於此

convertMonetary(value) { 
    return value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, "'") 
} 
+0

哪種國家格式是它? –

+0

會不會有其他輸入,比如'3344.34'?或'33.3'? –

+3

在執行正則表達式之前使用[Number.prototype.toFixed(2)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed)來處理小數點。 – Aaron

回答

1

的問題是不確切的最後兩位數字是不添加小數和.00需求,並非常明確的時候最後兩位數字小數,只有.需要被添加在正確的地方。

下面的代碼假定與或更少的位數,.00需要加入,否則最後2位被看作是小數並且加入.

運行它時,前2行是您的示例數據,下2行是示例,其中我在數字前添加了1以說明如何處理這些長度的數字。

function convertMonetary(inp) { 
 
    return inp.replace(/^(\d*?\d{1,6})(\d{2})?$/, function(m, whole, dec) { 
 
    return whole.replace(/\B(?=(\d{3})+(?!\d))/g, "'") + ((dec!=undefined)?'.'+dec:'.00'); 
 
    }); 
 
} 
 

 
document.getElementById('outp').value = 
 
    '77431745 => ' + convertMonetary('77431745') + '\n' + 
 
    '774317 => ' + convertMonetary('774317') + '\n\n' + 
 
    '177431745 => ' + convertMonetary('177431745') + '\n' + 
 
    '1774317 => ' + convertMonetary('1774317')
<textarea id="outp" rows="10" style="width:100%"></textarea>

要解釋一下,爲什麼正則表達式是事情是這樣的:

(\d*?\d{1,6})可能就一見傾心,爲什麼不只是做\d+意義不大。問題是後者\d{1,6}量詞是貪婪的,第一個\d的量詞*?不是,這就使得(\d{2})?只有在連續超過6位數時纔會匹配。

0

根據@Aaron的建議,問題是固定的。

我在RegEx執行前使用了toFixed(),並將值除以1,代碼如下所示。

convertMonetary(value) { 
    let val = (value/1).toFixed(2) 
    return val.toString().replace(/\B(?=(\d{3})+(?!\d))/g, "'") 
} 

謝謝。

+1

這是否意味着你只需要「1234567」 - >'1'234'567.00'?你可以使用你的正則表達式,然後追加'.00'。 –

+0

你是對的,只是測試了77431745,它像77'431'745.00這樣返回它,這是不正確的。 有什麼想法?如果我將價值與100分開,它就可以用於此目的,但其他數字將不正確。 –

+0

那個「1234567」值的正確輸出是什麼?還有其他什麼數字請提供問題中的全套測試用例。 –

相關問題