使用Javascript显示印度格式的数字。

59

我有以下的代码需要用印度货币数字系统显示。

 var x=125465778;
 var res= x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");

我得到这个输出:125,465,778

我需要这样的输出:12,54,65,778

请帮我解决这个问题。


1
期望输出的逻辑是什么?最后每两个数字之间有一个逗号吗? - Denys Séguret
是的,这是印度数字系统。 - tilak
它可以有小数点吗? - AllTooSir
100亿和1000亿怎么办?有人有解决方案吗? - Valentino Pereira
17个回答

108

我来晚了,但我想这会有所帮助 :)

你可以使用Number.prototype.toLocaleString()

语法

numObj.toLocaleString([locales [, options]])

var number = 123456.789;
// India uses thousands/lakh/crore separators
document.getElementById('result').innerHTML = number.toLocaleString('en-IN');
// → 1,23,456.789

document.getElementById('result1').innerHTML = number.toLocaleString('en-IN', {
    maximumFractionDigits: 2,
    style: 'currency',
    currency: 'INR'
});
// → ₹1,23,456.79
<div id="result"></div>
<div id="result1"></div>


5
太好了,我不知道还有这样的标准,并且得到了良好的浏览器支持。 - Fr0zenFyr
如果您的值是字符串,例如“123456.789”,请确保在调用之前将其转换为数字。即Number(number).toLocaleString('en-IN')。 - Tejasvi Hegde

70

对于整数:

    var x=12345678;
    x=x.toString();
    var lastThree = x.substring(x.length-3);
    var otherNumbers = x.substring(0,x.length-3);
    if(otherNumbers != '')
        lastThree = ',' + lastThree;
    var res = otherNumbers.replace(/\B(?=(\d{2})+(?!\d))/g, ",") + lastThree;
    alert(res);

演示

关于浮动:

    var x=12345652457.557;
    x=x.toString();
    var afterPoint = '';
    if(x.indexOf('.') > 0)
       afterPoint = x.substring(x.indexOf('.'),x.length);
    x = Math.floor(x);
    x=x.toString();
    var lastThree = x.substring(x.length-3);
    var otherNumbers = x.substring(0,x.length-3);
    if(otherNumbers != '')
        lastThree = ',' + lastThree;
    var res = otherNumbers.replace(/\B(?=(\d{2})+(?!\d))/g, ",") + lastThree + afterPoint;
    
    alert(res);

实时演示


4
当输入的数字为-123时,你的答案会返回-,123 - mrid
2
当我输入12345678901234.155时,它返回1,23,45,67,89,01,234.154。 - Akash D G
1
当传递-32650.75时,它返回-32,651.75。 - Jitendra Pancholi

30

简单易行的方法:

1. 使用 LocalString() 直接转换

(1000.03).toLocaleString()
(1000.03).toLocaleString('en-IN') # number followed by method

2. 使用Intl - 国际化API

Intl对象是ECMAScript国际化API的命名空间,提供了语言敏感的字符串比较、数字格式化和日期时间格式化。

例如:Intl.NumberFormat('en-IN').format(1000)

3. 使用自定义函数:

function numberWithCommas(x) {
    return x.toString().split('.')[0].length > 3 ? x.toString().substring(0,x.toString().split('.')[0].length-3).replace(/\B(?=(\d{2})+(?!\d))/g, ",") + "," + x.toString().substring(x.toString().split('.')[0].length-3): x.toString();
}

console.log("0 in indian format", numberWithCommas(0));
console.log("10 in indian format", numberWithCommas(10));
console.log("1000.15 in indian format", numberWithCommas(1000.15));
console.log("15123.32 in indian format", numberWithCommas(15123.32));

如果您的输入是 10000.5,

numberWithCommas(10000.5)

你将会获得这样的输出:10,000.5


你的回答可能对我有帮助,但请将其微调为最快且性能良好的答案。 - Sakthi Karthik
1
不完整的解决方案 |XXX| numberWithCommas(12345.32) => "1,23,45,.32" |XXX| numberWithCommas(12345222.32) => "12,34,52,22,.32" |XXX| numberWithCommas(45.32) => "45,.32" |XXX| numberWithCommas(45) => ",45" - D P Venkatesh
1
赞 Solution Number 2。我将在我的所有开发中使用它。 - SuKu

25

仅适用于整数,无需进行其他操作。

这将匹配从末尾开始的每个数字,其中有1个或多个双位数字模式,并用自身+“,”替换:

"125465778".replace(/(\d)(?=(\d\d)+$)/g, "$1,");
-> "1,25,46,57,78"

但是因为我们想要最终得到3,所以让我们通过在匹配输入结尾之前添加额外的“\d”来明确说明:

"125465778".replace(/(\d)(?=(\d\d)+\d$)/g, "$1,");
-> "12,54,65,778"

9

给定下面的函数一个数字,它会以印度数字格式进行分组并返回格式化后的数字。

例如:输入:12345678567545.122343

输出:1,23,45,67,85,67,545.122343

    function formatNumber(num) {
            input = num;
            var n1, n2;
            num = num + '' || '';
            // works for integer and floating as well
            n1 = num.split('.');
            n2 = n1[1] || null;
            n1 = n1[0].replace(/(\d)(?=(\d\d)+\d$)/g, "$1,");
            num = n2 ? n1 + '.' + n2 : n1;
            console.log("Input:",input)
            console.log("Output:",num)
            return num;
    }
    
    formatNumber(prompt("Enter Number",1234567))
    
    

https://jsfiddle.net/scLtnug8/1/


8

我来晚了。 但这里有一个隐式的方法可以做到。

var number = 3493423.34;

console.log(new Intl.NumberFormat('en-IN', { style: "currency", currency: "INR" }).format(number));

如果您不想要货币符号,可以这样使用:
console.log(new Intl.NumberFormat('en-IN').format(number));

要在React Native中使用它,只需安装Intl的polyfill,然后就可以开始了。 - shubhamkes

2
这些将格式化相应系统中的值。
$(this).replace(/\B(?=(?:\d{3})+(?!\d))/g, ','); 

对于美国数字系统(百万和十亿):
$(this).replace(/\B(?=(?:(\d\d)+(\d)(?!\d))+(?!\d))/g, ',');

对于印度数字符号(lakhs和crores)

2

最简单的方法就是使用Globalize插件(更多信息请参见这里这里):

var value = 125465778;
var formattedValue = Globalize.format(value, 'n');

2
尝试以下方法,我在这里找到了一个数字格式化插件:JavaScript 数字格式化器
使用该插件,我编写了下面的代码,它可以正常工作。请尝试一下,它会帮助你。
脚本如下:
<script src="format.20110630-1100.min.js" type="text/javascript"></script>

<script>
  var FullData = format( "#,##0.####", 125465778)
  var n=FullData.split(",");
  var part1 ="";
    for(i=0;i<n.length-1;i++)
    part1 +=n[i];
  var part2 = n[n.length-1]
  alert(format( "#0,#0.####", part1) + "," + part2);
</script>

输入:

1) 125465778
2) 1234567.89

输出:

1) 12,54,65,778
2) 12,34,567.89

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接