输入屏蔽(千位分隔符/十进制 - 我们)使用Knock out read&写选项

时间:2014-05-19 13:44:42

标签: regex jquery-plugins knockout.js knockout-mapping-plugin knockout-validation

我要求将十进制值格式化为美元格式(即每个十进制数字应在开头附加$符号并在每3位数后引入逗号。

例如:999999999应转换为$ 999,999,999.00用于显示目的,而原始值应保留原样用于进一步计算。

        self.MonthlyAppliedEmployerContributionAmount = ko.observable(MonthlyAppliedEmployerContribution);

        self.MonthlyAppliedEmployerContributionAmountFormatted = ko.computed({
            read: function () {
                return '$' + parseFloat(self.MonthlyAppliedEmployerContributionAmount()).toFixed(2);
            },
            write: function (value) {
                // Strip out unwanted characters, parse as float, then write the raw data back to the underlying "price" observable
                value = parseFloat(value.replace(/[^\.\d]/g, ""));
                self.MonthlyAppliedEmployerContributionAmount(isNaN(value) ? 0 : value); // Write to underlying storage
            }
        });

在阅读可观察的财产时,我在开头追加$& .toFixed(2)帮助我实现了限制2位小数。

但我不确定如何在每三位数之后引入逗号。

注意:在KO写入方法中,我将删除读取方法中引入的所有格式。

我不想使用Jquery掩码插件,因为它们大部分都不是直接来自Jquery lib,而是由某些第三方制作,可能会在某个时间点破坏。

欣赏早期回应。

2 个答案:

答案 0 :(得分:1)

您可以使用此正则表达式插入千位分隔符:

function addThousandSeparator(s) { 
  return s.replace(/(\d)(?:(?=\d+(?=[^\d.]))(?=(?:\d{3})+\b)|(?=\d+(?=\.))(?=(?:\d{3})+(?=\.)))/gm, '$1,');
}

如果您需要另外一千个分隔符,请将'$1,'中的逗号替换为分隔符。

所以你会:

read: function () {
            return '$' + addThousandSeparator(parseFloat(self.MonthlyAppliedEmployerContributionAmount())
                         .toFixed(2));

        }

答案 1 :(得分:0)

您应该使用一个现有的本地化库来为您进行解析和格式化。例如:

这些是最受欢迎的,并且很容易解决您的问题。