jqgrid货币格式化程序

jqgrid货币格式化程序,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

在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: 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: ',' } },
        ...
],