jqgrid货币格式化程序
在Jqgrid for currency formatter中,只有千个可用的分离程序,但我需要一个lakhsSeparatorjqgrid货币格式化程序,jqgrid,Jqgrid,在Jqgrid for currency formatter中,只有千个可用的分离程序,但我需要一个lakhsSeparator colModel: [ {name: 'Code', index: 'Code', width: 55, editable: true, sortable: true }, { name: 'Ammount', index: 'Ammount', width: 100, editable: true, sortable: fal
colModel: [
{name: 'Code', index: 'Code', width: 55, editable: true, sortable: true },
{ name: 'Ammount', index: 'Ammount', width: 100, editable: true, sortable: false, formatter: 'currency', formatoptions: { prefix: '($', suffix: ')', thousandsSeparator: ','} },
],
在这里,我要用lakhsSeparator代替千分之差。您可以将此功能添加到格式化程序中。首先,您需要修改内置的NumberFormat函数。为此,可以在加载jqGrid脚本文件后运行以下脚本:
$.fmatter.util.NumberFormat = function(nData,opts) {
if(!$.fmatter.isNumber(nData)) {
nData *= 1;
}
if($.fmatter.isNumber(nData)) {
var bNegative = (nData < 0);
var sOutput = nData + "";
var sDecimalSeparator = (opts.decimalSeparator) ? opts.decimalSeparator : ".";
var nDotIndex;
if($.fmatter.isNumber(opts.decimalPlaces)) {
var nDecimalPlaces = opts.decimalPlaces;
var nDecimal = Math.pow(10, nDecimalPlaces);
sOutput = Math.round(nData*nDecimal)/nDecimal + "";
nDotIndex = sOutput.lastIndexOf(".");
if(nDecimalPlaces > 0) {
if(nDotIndex < 0) {
sOutput += sDecimalSeparator;
nDotIndex = sOutput.length-1;
}
else if(sDecimalSeparator !== "."){
sOutput = sOutput.replace(".",sDecimalSeparator);
}
while((sOutput.length - 1 - nDotIndex) < nDecimalPlaces) {
sOutput += "0";
}
}
}
if(opts.thousandsSeparator) {
var sThousandsSeparator = opts.thousandsSeparator;
nDotIndex = sOutput.lastIndexOf(sDecimalSeparator);
nDotIndex = (nDotIndex > -1) ? nDotIndex : sOutput.length;
var sNewOutput = sOutput.substring(nDotIndex);
var nCount = -1;
for (var i=nDotIndex; i>0; i--) {
nCount++;
if ((nCount%3 === 0) && (i !== nDotIndex) && (!bNegative || (i > 1))) {
sNewOutput = sThousandsSeparator + sNewOutput;
}
sNewOutput = sOutput.charAt(i-1) + sNewOutput;
}
sOutput = sNewOutput;
}
else if(opts.lakhsSeparator) {
var sLakhsSeparator = opts.lakhsSeparator;
nDotIndex = sOutput.lastIndexOf(sDecimalSeparator);
nDotIndex = (nDotIndex > -1) ? nDotIndex : sOutput.length;
var sNewOutput = sOutput.substring(nDotIndex);
var nCount = -1;
var i = nDotIndex;
while (i > 0) {
for (var nCount = 0; nCount < 7 && i > 0; nCount++) {
sNewOutput = sOutput.charAt(i-1) + sNewOutput;
if (((nCount === 2) || (nCount === 4) || (nCount == 6)) && (!bNegative || (i > 1))) {
sNewOutput = sLakhsSeparator + sNewOutput;
}
i--;
}
}
sOutput = sNewOutput;
}
sOutput = (opts.prefix) ? opts.prefix + sOutput : sOutput;
sOutput = (opts.suffix) ? sOutput + opts.suffix : sOutput;
return sOutput;
} else {
return nData;
}
};
这会给你要求的结果。我觉得这个问题很有趣。我建议不要实现插件。你可以找到更多关于它的信息 用法将很简单。应该定义哪些使用
Globalize.format
,哪些使用Globalize.parseFloat
函数。比如说
格式化程序:函数(v){
//使用“c”表示货币格式化程序,“n”表示数字
返回Globalize.format(数字(v),“c”);
},
未格式化:函数(v){
返回Globalize.parseFloat(v);
}
为了更方便起见,我建议定义numberTemplate
和currencyTemplate
,例如
var numberTemplate={align:'right',sorttype:'number',可编辑:true,
搜索选项:{sopt:['eq','ne','lt','le','gt','ge','nu','nn','in','ni']},
格式化程序:函数(v){
返回Globalize.format(数字(v),“n”);
},
未格式化:函数(v){
返回Globalize.parseFloat(v);
}},
currencyTemplate={align:'right',sorttype:'number',可编辑:true,
搜索选项:{sopt:['eq','ne','lt','le','gt','ge','nu','nn','in','ni']},
格式化程序:函数(v){
返回Globalize.format(数字(v),“c”);
},
未格式化:函数(v){
返回Globalize.parseFloat(v);
}};
并在colModel
中使用
{name:'amount',index:'amount',width:150,template:currencyTemplate},
{name:'age',index:'age',宽度:52,模板:numberTemplate},
使用“en IN”区域设置并显示结果,如下图所示
非常感谢它的工作,只是做了一些小改动,但如果列是可编辑的,那么我们需要将代码附加到unformat。@Meraj Yes(编辑$)的情况下。unformat应按如下方式修改well@tpeczek:我如何理解从第10个分离器应与数千个分离器一起工作。此外,不仅支持
nCount<7
。如果我理解正确,数字3210987654321
将在印度写成32,10,98,76,54321
。它对应于中的groupsize:[3,2]
而不是en-US中的默认groupsize:[3]
设置(默认设置)。@tpeczek:我找到了使用Globalize插件解决此类问题的最简单方法。有关详细信息,请参阅我的答案。@Oleg我的第一种方法与您的类似,但我已经阅读了介绍Lakh和Crore的文章。根据这篇文章,编号3210987654321在印度应写成3,21098,76,45321。我想我们这里需要一位印度专家。谢谢你的回答,但还有一个信息,在这种情况下,我如何提供负货币格式,如“-$1.00”@Meraj:已经包含了关于负货币格式的信息。例如,“Rs-2,10,98,76,54321.00”。如果您发现负货币的另一种格式更好,您可以在culture.en in.js
模式:[“$-n”,“$n”]
的副本中修改为另一个值,或者您可以在货币的自定义格式化程序中使用Globalize.format(Number(v),“n”)
而不是Globalize.format(Number(v),“c”)
。您可以根据需要添加“-”或其他附加字符。@Meraj:另一件事对我来说很有趣:数字“1000000000000000”
将如何在您的国家书写:如“1000,00,00000,00,00000”
或如“1,00,00,00,00,00,00,00000”
?参见Tomasz Pęczek(tpeczek)回答下的讨论。Oleg:我们显示印度数字系统中的10亿卢比为10,00,00000,00,00000,tpeczek解决方案在我的案例中非常合适。@Meraj:谢谢!我将向全球化插件的开发者发布相应的bug报告。
colModel: [
{ name: 'Code', index: 'Code', width: 55, editable: true, sortable: true },
{ name: 'Ammount', index: 'Ammount', width: 100, editable: true, sortable: false, formatter: 'currency', formatoptions: { prefix: '($', suffix: ')', thousandsSeparator: null, lakhsSeparator: ',' } },
...
],