2010-09-20 86 views
53

Javascript中是否有函数用于格式化数字和字符串?JavaScript千位分隔符/字符串格式

我正在寻找一种方式,千个分隔字符串或数字... (像的String.Format在C#)

+0

http://bytes.com/topic/c-sharp/answers/248039-formatcurrency-equiv – bevacqua 2010-09-20 16:41:18

+0

我想你”将找到你需要在那里:) http://stackoverflow.com/questions/610406/javascript-printf-string-format – Jad 2010-09-20 16:41:55

+0

'如何在JavaScript中使用逗号作为千位分隔符打印数字:http:// stackoverflow。 com/questions/2901102/how-to-print-a-number-with-commas-as-thousands-separators-in-javascript – 2016-12-08 15:44:00

回答

50

更新(7年后)

参考在引用下面的原始答案是错误的。有一个内置的功能这一点,而这正是kaiser以下建议:toLocaleString

所以,你可以这样做:实施以下工程

(1234567.89).toLocaleString('en')    // for numeric input 
parseFloat("1234567.89").toLocaleString('en') // for string input 

的功能,太多,但根本没有必要。

(我想也许我会得到幸运,发现它必要早在2010年,但没有。根据这一more reliable reference,的toLocaleString自ECMAScript的第三版[1999],已经成为标准的一部分我相信,意味着它会一直早在IE 5.5的支持。)


原来的答案

根据this reference没有内置的功能添加逗号的数字。但是,页面包括如何自行编码它的一个例子:

function addCommas(nStr) { 
    nStr += ''; 
    var x = nStr.split('.'); 
    var x1 = x[0]; 
    var x2 = x.length > 1 ? '.' + x[1] : ''; 
    var rgx = /(\d+)(\d{3})/; 
    while (rgx.test(x1)) { 
      x1 = x1.replace(rgx, '$1' + ',' + '$2'); 
    } 
    return x1 + x2; 
} 

编辑: 要转到另一条路(字符串转换与逗号号),你可以做这样的事情:

parseFloat("1,234,567.89".replace(/,/g,'')) 
+0

真的很欣赏它//但我怎样才能将该字符串(用逗号)转换为数字? – LostLord 2010-09-20 16:51:13

+0

这个函数打破了大于100,000的数字 – DevZer0 2015-04-28 07:27:36

+1

@ DevZer0不,它不是 – Tallboy 2016-01-06 02:27:24

0

PHP.js有一个功能可以做到这一点,称为number_format。如果您熟悉PHP,它的工作原理是exactly the same way

+0

第一个链接跟在JS实现之后的PHP版本。这很有用。 – 2014-04-08 15:11:58

3
// thousand separates a digit-only string using commas 
// by element: onkeyup = "ThousandSeparate(this)" 
// by ID:  onkeyup = "ThousandSeparate('txt1','lbl1')" 
function ThousandSeparate() 
{ 
    if (arguments.length == 1) 
    { 
     var V = arguments[0].value; 
     V = V.replace(/,/g,''); 
     var R = new RegExp('(-?[0-9]+)([0-9]{3})'); 
     while(R.test(V)) 
     { 
      V = V.replace(R, '$1,$2'); 
     } 
     arguments[0].value = V; 
    } 
    else if (arguments.length == 2) 
    { 
     var V = document.getElementById(arguments[0]).value; 
     var R = new RegExp('(-?[0-9]+)([0-9]{3})'); 
     while(R.test(V)) 
     { 
      V = V.replace(R, '$1,$2'); 
     } 
     document.getElementById(arguments[1]).innerHTML = V; 
    } 
    else return false; 
} 
110

如果是关于本地化千位分隔符,分隔符和小数点分隔符,去与以下内容:

// --> numObj.toLocaleString([locales [, options] ]) 
parseInt(number).toLocaleString(); 

有几个选项,你可以使用(甚至与回退语言环境):

number = 123456.7089; 
 

 
result = parseInt(number).toLocaleString() + "<br>"; 
 
result += number.toLocaleString('de-DE') + "<br>"; 
 
result += number.toLocaleString('ar-EG') + "<br>"; 
 
result += number.toLocaleString('ja-JP', { 
 
    style   : 'currency', 
 
    currency  : 'JPY', 
 
    currencyDisplay : 'symbol', 
 
    useGrouping  : true 
 
}) + "<br>"; 
 
result += number.toLocaleString([ 'jav', 'en' ], { 
 
    localeMatcher   : 'lookup', 
 
    style     : 'decimal', 
 
    minimumIntegerDigits  : 2, 
 
    minimumFractionDigits : 2, 
 
    maximumFractionDigits : 3, 
 
    minimumSignificantDigits : 2, 
 
    maximumSignificantDigits : 3 
 
}) + "<br>"; 
 

 
var el = document.getElementById('result'); 
 
el.innerHTML = result;
<div id="result"></div>

关于MDN info page的详细信息。

编辑:评注@I like Serena增加了以下内容:

要支持的浏览器使用非英语语言环境,我们仍然希望英语格式,使用value.toLocaleString('en')。也适用于浮点。

+3

我只能说哇。美丽。 – pimbrouwers 2014-03-03 20:59:32

+11

+1不重新发明车轮。 – 2014-03-20 14:18:01

+4

假设浏览器的语言环境始终是你想要的... – sibidiba 2014-04-15 11:09:27

24

试图与一个正则表达式(不回调)来处理这个我目前的能力失败我缺少一个负的在Javascript向后看...从来没有少这里的另一个在大多数作品简洁替代一般情况 - 通过忽略匹配索引出现在句点索引之后的匹配来计算任意小数点。

function format(num){ 
    var n = num.toString(), p = n.indexOf('.'); 
    return n.replace(/\d(?=(?:\d{3})+(?:\.|$))/g, function($0, i){ 
     return p<0 || i<p ? ($0+',') : $0; 
    }); 
} 

测试用例:

format(100)   // "100" 
format(1000)   // "1,000" 
format(1e10)   // "10,000,000,000" 
format(1000.001001) // "1,000.001001" 

» Verbose regex explanation (regex101.com)
enter image description here

+0

此语法图是否已在regex101.com上创建? – 2017-04-19 23:26:36

+1

@GeroldBroser https://regexper.com – Emissary 2017-04-20 05:46:02

6

有一个不错的jQuery插件数量:https://github.com/teamdf/jquery-number

它允许就是你改变你喜欢的格式的任何号码,与十进制数字选项和分隔符小数和千:

$.number(12345.4556, 2);   // -> 12,345.46 
$.number(12345.4556, 3, ',', ' ') // -> 12 345,456 

你可以用它直接输入字段,这是更好的内部,采用与上述相同的选项:

$("input").number(true, 2); 

,也可以使用选择应用到整个组DOM元素:

$('span.number').number(true, 2); 
-1

我不喜欢任何这里的答案,所以我创建了一个功能,使得w为我而言。只是想分享,以防其他人发现它有用。

function getFormattedCurrency(num) { 
    num = num.toFixed(2) 
    var cents = (num - Math.floor(num)).toFixed(2); 
    return Math.floor(num).toLocaleString() + '.' + cents.split('.')[1]; 
} 
1

我用这个:

function numberWithCommas(number) { 
    return number.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); 
} 

来源:link

+0

''123452343267.0505'.replace(/ \ B(?=(\ d {3})+(?!\ d))/ g,“,”); “123,452,343,267.0,505”' - 注意小数点后面的逗号。 – hippietrail 2017-10-03 00:53:34

0

所有你需要做的就是真的this

123000.9123.toLocaleString() 
//result will be "123,000.912" 
+0

不幸的是它取决于你的平台。有一些''toLocaleString()'不添加逗号,或缺少标准中的其他功能。很容易检查'toLocaleString'的存在,但不检查其符合性。 – hippietrail 2017-10-03 00:56:04

1

您可以使用JavaScript。下面是代码,它只会accept数字和一个dot

这里是JavaScript

<script > 

      function FormatCurrency(ctrl) { 
       //Check if arrow keys are pressed - we want to allow navigation around textbox using arrow keys 
       if (event.keyCode == 37 || event.keyCode == 38 || event.keyCode == 39 || event.keyCode == 40) { 
        return; 
       } 

       var val = ctrl.value; 

       val = val.replace(/,/g, "") 
       ctrl.value = ""; 
       val += ''; 
       x = val.split('.'); 
       x1 = x[0]; 
       x2 = x.length > 1 ? '.' + x[1] : ''; 

       var rgx = /(\d+)(\d{3})/; 

       while (rgx.test(x1)) { 
        x1 = x1.replace(rgx, '$1' + ',' + '$2'); 
       } 

       ctrl.value = x1 + x2; 
      } 

      function CheckNumeric() { 
       return event.keyCode >= 48 && event.keyCode <= 57 || event.keyCode == 46; 
      } 

    </script> 

HTML

<input type="text" onkeypress="return CheckNumeric()" onkeyup="FormatCurrency(this)" /> 

DEMO JSFIDDLE

0
number = 123456.7089; 
result = parseInt(number).toLocaleString() + "<br>"; 
result = number.toLocaleString('pt-BR') + "<br>"; 

var el = document.getElementById('result'); 
el.innerHTML = result; 
<div id="result"></div> 
+6

您可以添加一些描述以便op和其他人可以理解此代码如何实际解决问题。谢谢 – 2017-09-26 13:58:37