2016-11-03 103 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”值的正确输出是什么?还有其他什么数字请提供问题中的全套测试用例。 –

相关问题