Javascript千位分隔符/字符串格式[重复]


96

Javascript中是否有用于格式化数字和字符串的函数?

我正在寻找一种用于字符串或数字的千位分隔符的方法...(如C#中的String.Format)



我想你会发现你所需要的在那里:) stackoverflow.com/questions/610406/...
亚德

How to print a number with commas as thousands separators in JavaScriptstackoverflow.com/questions/2901102/...
阿德里安要

Answers:


159

更新(7年后)

以下原始答案中引用的参考文献有误。这里一个内置的功能,这一点,而这正是德皇以下建议:toLocaleString

因此,您可以执行以下操作:

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

下面实现的功能也可以使用,但是根本没有必要。

(我想也许我会很幸运,发现必要追溯到2010年,但不是。根据这个更可靠的参考,自ECMAScript 3rd Edition [1999]以来,toLocaleString已成为标准的一部分,我认为这意味着早在IE 5.5上就可以支持。)


原始答案

根据此参考资料,没有内置函数可将逗号添加到数字中。但是该页面包含了一个如何自己编写代码的示例:

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,''))

真的很感谢//但是如何将字符串(带逗号)转换为数字?
LostLord

此函数针对大于100,000的数字中断
DevZer0

1
@ DevZer0没有它不会
督学

适用于纯JavaScript +单个正则表达式替换 stackoverflow.com/a/44324879/681830
Val

4
使用(1234567).toLocaleString().replace(/,/g," ",)千之间的空间
Fanky

122

如果要本地化数千个分隔符,定界符和十进制分隔符,请执行以下操作:

// --> 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信息页面的详细信息

编辑:评注@I像Serena添加以下:

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


这不包括浮点数。您可以将parseInt更改为parseFloat,但是如果yourInt =“ 100,12”(逗号作为小数点分隔符),则此操作将失败。可以使用replace(“,”,“。”)..进行修复,但再次失败时将显示为“ 1.000,12”。所以...您有时必须重新发明轮子。stackoverflow.com/a/2901298/1028304
neiker 2014年

效果不好。在我们的语言环境空间中使用逗号对数千个分隔符来说很常见。
JosefSábl2014年

1
这会更合适:Number(yourNumberOrString).toLocaleString()
乔纳森(Jonathan)

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

1
@ Serhiog.Lazin 在Safari(以及在哪个操作系统和哪个版本)上,哪些功能不起作用?
kaiser

34

使用后向支持进行了更新,以符合ECMAScript2018的更改。
为了向后兼容,请向下滚动以查看原始解决方案。

可以使用正则表达式-在处理以字符串形式存储的大数字时特别有用。

const format = num => 
    String(num).replace(/(?<!\..*)(\d)(?=(?:\d{3})+(?:\.|$))/g, '$1,')

;[
    format(100),                           // "100"
    format(1000),                          // "1,000"
    format(1e10),                          // "10,000,000,000"  
    format(1000.001001),                   // "1,000.001001"
    format('100000000000000.001001001001') // "100,000,000,000,000.001001001001
]
    .forEach(n => console.log(n))

»详细的正则表达式说明(regex101.com) 流程图


原始答案可能不是必需的,但可用于向后兼容。

尝试使用单个正则表达式(不带回调)来处理此问题,我目前的能力使我无法在Javascript中缺少负向后缀……不过,这是在大多数情况下都可以使用的另一个简洁的选择-占小数点通过忽略匹配的索引,该匹配的索引出现在句点索引之后。

const format = num => {
    const n = String(num),
          p = n.indexOf('.')
    return n.replace(
        /\d(?=(?:\d{3})+(?:\.|$))/g,
        (m, i) => p < 0 || i < p ? `${m},` : m
    )
}

;[
    format(100),                           // "100"
    format(1000),                          // "1,000"
    format(1e10),                          // "10,000,000,000"  
    format(1000.001001),                   // "1,000.001001"
    format('100000000000000.001001001001') // "100,000,000,000,000.001001001001
]
    .forEach(n => console.log(n))

»详细的正则表达式说明(regex101.com)

流程图


此语法图是否已在regex101.com上创建?
Gerold Broser

带小数的数字会发生什么?
艾米利亚诺

我收到“无效的正则表达式:无效的组说明符名称”。在React Native 0.59上执行此操作,但这确实不应该影响RegEx。
Joshua Pinter

@JoshuaPinter将使用look-behind,在撰写本文时,尚不支持所有平台。我猜您是在专门指iOS,因为Safari对我来说仍然失败。暂时最好还是使用向后兼容版本。我只是想让我的答案适应未来。 caniuse.com/#search=lookbehind
使者

1
@Emissary感谢您的提示。是的,它在React Native 0.59 / Android上,它使用相对较旧的JavaScriptCore(JSC)版本。在更新到React Native 0.60+之后,我将再试一次,其中包括对JSC的更新。
Joshua Pinter

10

有一个不错的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);

最佳解决方案imho
Michal,

我不这么认为,添加了近800行的新文件要求,就像用Granade杀死一只蚂蚁
Emiliano

6

我用这个:

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

来源:链接


'123452343267.0505'.replace(/\B(?=(\d{3})+(?!\d))/g, ","); "123,452,343,267.0,505"-注意小数点后的最后一个逗号。
hippietrail

5
// 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;
}   


3

您可以使用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)" />

演示JSFIDDLE


2
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和其他人可以理解此代码实际上是如何解决问题的。谢谢
Punit Gajjar

尝试使用11
Emiliano


1

所有你需要做的就是真的这样

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

不幸的是,这取决于您的平台。有些具有toLocaleString()未添加逗号或缺少标准中其他功能的。检查是否toLocaleString存在很容易,但不检查其合规性。
hippietrail

尝试使用1000到9999之间的数字
Emiliano

0

反应溶液的组合

  let converter = Intl.NumberFormat();
  let salary =  monthlySalary.replace(/,/g,'')
  console.log(converter.format(salary))

  this.setState({
    monthlySalary: converter.format(salary)
  })
}

handleOnChangeMonthlySalary(1000)```

0

您可以使用ngx-format-field。这是用于格式化将出现在视图中的输入值的指令。它不会操纵将保存在后端的Input值。在这里查看链接!

例:

component.html:

<input type="text" formControlName="currency" [appFormatFields]="CURRENCY"
(change)="onChangeCurrency()">

component.ts

onChangeCurrency() {
this.currency.patchValue(this.currency.value);
}

观看演示:在这里


0

您可以使用以下功能:

function format(number, decimals = 2, decimalSeparator = '.', thousandsSeparator = ',') {
  const roundedNumber = number.toFixed(decimals);
  let integerPart = '',
    fractionalPart = '';
  if (decimals == 0) {
    integerPart = roundedNumber;
    decimalSeparator = '';
  } else {
    let numberParts = roundedNumber.split('.');
    integerPart = numberParts[0];
    fractionalPart = numberParts[1];
  }
  integerPart = integerPart.replace(/(\d)(?=(\d{3})+(?!\d))/g, `$1${thousandsSeparator}`);
  return `${integerPart}${decimalSeparator}${fractionalPart}`;
}

// Use Example

let min = 1556454.0001;
let max = 15556982.9999;

console.time('number format');
for (let i = 0; i < 15; i++) {
  let randomNumber = Math.random() * (max - min) + min;
  let formated = format(randomNumber, 4, ',', '.'); // formated number

  console.log('number: ', randomNumber, '; formated: ', formated);
}
console.timeEnd('number format');


不要让它如此混乱。只需使用toLocaleString()。在更多信息developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
萨贾德Saderi

@sajadsaderi我也使用toLocaleString()朋友,但是此函数并没有给我太大的灵活性,因此我不必处理区域缩写,其他人也可以使用它,因为此函数的定义与number_format相同()php的功能。
jin_maxtor

-1

我不喜欢这里的任何答案,因此我创建了一个对我有用的函数。只想分享,以防其他人发现它有用。

function getFormattedCurrency(num) {
    num = num.toFixed(2)
    var cents = (num - Math.floor(num)).toFixed(2);
    return Math.floor(num).toLocaleString() + '.' + cents.split('.')[1];
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.