Javascript千位分隔符/字符串格式

IT技术 javascript string numbers format
2021-01-18 05:52:24

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

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

6个回答

更新(7年后)

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

所以你可以这样做:

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

下面实现的函数也可以工作,但根本没有必要。

(我想也许我会很幸运并在 2010 年发现它必要的,但没有。根据这个更可靠的参考,toLocaleString 自 ECMAScript 3rd Edition [1999] 以来一直是标准的一部分,我相信这意味着它早在 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,''))
@DevZer0 不,不是
2021-03-15 05:52:24
使用纯 javascript + 单个正则表达式替换 stackoverflow.com/a/44324879/681830
2021-03-19 05:52:24
使用(1234567).toLocaleString().replace(/,/g," ",)千之间的空格
2021-03-26 05:52:24
此函数会因大于 100,000 的数字而中断
2021-03-30 05:52:24
真的很感激它//但是我如何将该字符串(带逗号)转换为数字?
2021-04-10 05:52:24

如果是关于本地化千位分隔符、分隔符和小数点分隔符,请使用以下内容:

// --> 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'). 也适用于浮点。

仅供参考,对于像印度这样的数字格式7,77,77,777,请使用value.toLocaleString('en-IN')
2021-03-15 05:52:24
这不包括浮点数..您可以将 parseInt 更改为 parseFloat,但是如果 yourInt = "100,12" (逗号作为小数点分隔符),这将失败。这可以通过替换(“,”,“。”)来解决,但会再次失败,“1.000,12”。所以......有时你必须重新发明轮子。stackoverflow.com/a/2901298/1028304
2021-03-17 05:52:24
@Serhiog.Lazin究竟什么在 Safari 上不起作用(以及在哪个操作系统和哪个版本中)?
2021-03-17 05:52:24
要支持我们仍需要英语格式的非英语语言环境的浏览器,请使用value.toLocaleString('en'). 也适用于浮点。
2021-03-30 05:52:24
这会更合适: Number(yourNumberOrString).toLocaleString()
2021-04-11 05:52:24

根据 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)

流程图

带小数的数字会发生什么?
2021-03-13 05:52:24
@JoshuaPinter 这将是在撰写本文时尚未在所有平台上支持的后视的使用。我猜你是专门指 iOS - 因为 Safari 对我来说仍然失败。现在最好坚持使用向后兼容的版本。我只是想证明我的答案面向未来。 caniuse.com/#search=lookbehind
2021-03-13 05:52:24
@Emissary 感谢您的提示。是的,它在 React Native 0.59 / Android 上,它使用相对较旧版本的 JavaScriptCore (JSC)。在我们更新到 React Native 0.60+ 之后,我会再试一次,其中包括对 JSC 的更新。
2021-03-13 05:52:24
这个语法图是在 regex101.com 上创建的吗?
2021-03-16 05:52:24
我收到“无效的正则表达式:无效的组说明符名称”。在 React Native 0.59 上这样做,但这真的不应该影响 RegEx。
2021-04-03 05:52:24

有一个不错的 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);
我不这么认为,添加一个将近800行的新文件要求,就像用榴弹杀死一只蚂蚁
2021-03-23 05:52:24
最好的解决方案恕我直言
2021-03-30 05:52:24

我用这个:

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" - 注意小数点后的最后一个逗号。
2021-03-15 05:52:24