您正在查看服务器和客户端区域设置之间的差异。
您的 .NET 代码根据服务器区域设置格式化数字,而您的 JS 代码根据浏览器区域设置格式化数字。
尝试在浏览器中更改区域设置/区域。
编辑:
(我将离开上述内容,以防它对其他人有所帮助,即使它对您没有帮助)
问题在于您对服务器端和客户端之间差异的理解。
Razor 代码在服务器上执行并“翻译”成 HTML。
然而,服务器将 Javascript 视为文本,只是它发送的 HTML 文档的一部分。
Javascript 在客户端机器(即浏览器)上执行。
Razor Helper 如何格式化数字取决于服务器上设置的区域设置。然而,javascript 将根据浏览器中设置的区域设置数字格式。
要强制敲除/Javascript 以您想要的方式格式化数字,而不考虑区域设置(在客户端),您可以使用以下方法在其核心处编写 custom-binding:
function formatWithComma(x, precision, seperator) {
var options = {
precision: precision || 2,
seperator: seperator || ','
}
var formatted = x.toFixed( options.precision );
var regex = new RegExp('^(\\d+)[^\\d](\\d{' + options.precision + '})$');
formatted = formatted.replace(regex, '$1' + options.seperator + '$2');
return formatted;
}
所以你的绑定看起来像这样:
ko.bindingHandlers.commaDecimalFormatter = {
init: function(element, valueAccessor) {
var observable = valueAccessor();
var interceptor = ko.computed(function() {
return formatWithComma( observable() );
}
ko.applyBindingsToNode( element , { value: interceptor } );
}
}
然后在你的 Razor 视图中:
@ko.Bind.Custom("commaDecimalFormatter ", m => m.MyCustom)
(请注意,我从未使用过 KnockoutMVC,因此最后一行直接来自文档,但绑定名称已更改 - 未经测试。
另外,我使用了ko.computed,所以这个绑定是只读的——在<input> 元素上使用它是没有意义的。最好在<span> 上使用。您可以将其设为实现反向的双向绑定:
ko.computed( {
read: function() {
/* method as above */
},
write: function(newValue) {
/* implement reverse */
observable( newValue );
}
}
编辑 2
希望这个fiddle 更清楚