javascript:将函数的输出更改为指定的小数位

标签 javascript function object number-formatting

我不太擅长使用 javascript,但最近需要使用库来输出聚合表。正在使用fin-hypergrid .

有一部分我需要将求和函数(本例中为 rollups.sum(11))插入到一个对象中,以便它可以计算表中的聚合值,如下所示:

aggregates = {Value: rollups.sum(11)}

我想更改此值以返回 2 位小数并尝试:

rollups.sum(11).toFixed(2)

但是,它给出了错误:“rollups.sum(...).toFixed 不是函数”

如果我尝试这样的事情:

parseFloat(rollups.sum(11)).toFixed(2)

它抛出错误:“无法分配给 (new String("NaN")) 的属性:不是对象”

所以它必须是一个函数对象。

我可以知道是否有办法改变函数 rollups.sum(11) 以返回具有 2 位小数的函数对象?

(侧面信息:rollups.sum(11) 来自一个模块,该模块提供:

sum: function(columnIndex) {
    return sum.bind(this, columnIndex);
}

)

抱歉,由于数据保密问题,我无法在此处发布示例输出。 但是,这是我遵循的示例中的代码。我基本上需要更改汇总。无论如何给出小数位。这里sum(11)中的“11”指的是“列索引”。

window.onload = function() {

var Hypergrid = fin.Hypergrid;
var drillDown = Hypergrid.drillDown;
var TreeView = Hypergrid.TreeView;
var GroupView = Hypergrid.GroupView;
var AggView = Hypergrid.AggregationsView;

// List of properties to show as checkboxes in this demo's "dashboard"
var toggleProps = [{
        label: 'Grouping',
        ctrls: [
            { name: 'treeview', checked: false, setter: toggleTreeview },
            { name: 'aggregates', checked: false, setter: toggleAggregates },
            { name: 'grouping', checked: false, setter: toggleGrouping}
        ]
    }
];

function derivedPeopleSchema(columns) {
    // create a hierarchical schema organized by alias
    var factory = new Hypergrid.ColumnSchemaFactory(columns);
    factory.organize(/^(one|two|three|four|five|six|seven|eight)/i, { key: 'alias' });
    var columnSchema = factory.lookup('last_name');
    if (columnSchema) {
        columnSchema.defaultOp = 'IN';
    }
    //factory.lookup('birthState').opMenu = ['>', '<'];
    return factory.schema;
}

var customSchema = [
    { name: 'last_name', type: 'number', opMenu: ['=', '<', '>'], opMustBeInMenu: true },
    { name: 'total_number_of_pets_owned', type: 'number' },
    { name: 'height', type: 'number' },
    'birthDate',
    'birthState',
    'employed',
    { name: 'income', type: 'number' },
    { name: 'travel', type: 'number' }
];

var peopleSchema = customSchema;  // or try setting to derivedPeopleSchema

var gridOptions = {
        data: people1,
        schema: peopleSchema,
        margin: { bottom: '17px' }
    },
    grid = window.g = new Hypergrid('div#json-example', gridOptions),
    behavior = window.b = grid.behavior,
    dataModel = window.m = behavior.dataModel,
    idx = behavior.columnEnum;

console.log('Fields:');  console.dir(behavior.dataModel.getFields());
console.log('Headers:'); console.dir(behavior.dataModel.getHeaders());
console.log('Indexes:'); console.dir(idx);

var treeView, dataset;

function setData(data, options) {
    options = options || {};
    if (data === people1 || data === people2) {
        options.schema = peopleSchema;
    }
    dataset = data;
    behavior.setData(data, options);
    idx = behavior.columnEnum;
}

// Preset a default dialog options object. Used by call to toggleDialog('ColumnPicker') from features/ColumnPicker.js and by toggleDialog() defined herein.
grid.setDialogOptions({
    //container: document.getElementById('dialog-container'),
    settings: false
});

// add a column filter subexpression containing a single condition purely for demo purposes
if (false) { // eslint-disable-line no-constant-condition
    grid.getGlobalFilter().columnFilters.add({
        children: [{
            column: 'total_number_of_pets_owned',
            operator: '=',
            operand: '3'
        }],
        type: 'columnFilter'
    });
}

window.vent = false;

//functions for showing the grouping/rollup capabilities
var rollups = window.fin.Hypergrid.analytics.util.aggregations,
    aggregates = {
        totalPets: rollups.sum(2),
        averagePets: rollups.avg(2),
        maxPets: rollups.max(2),
        minPets: rollups.min(2),
        firstPet: rollups.first(2),
        lastPet: rollups.last(2),
        stdDevPets: rollups.stddev(2)
    },
    groups = [idx.BIRTH_STATE, idx.LAST_NAME, idx.FIRST_NAME];

var aggView, aggViewOn = false, doAggregates = false;
function toggleAggregates() {
    if (!aggView){
        aggView = new AggView(grid, {});
        aggView.setPipeline({ includeSorter: true, includeFilter: true });
    }
    if (this.checked) {
        grid.setAggregateGroups(aggregates, groups);
        aggViewOn = true;
    } else {
        grid.setAggregateGroups([], []);
        aggViewOn = false;
    }
}

function toggleTreeview() {
    if (this.checked) {
        treeView = new TreeView(grid, { treeColumn: 'State' });
        treeView.setPipeline({ includeSorter: true, includeFilter: true });
        treeView.setRelation(true, true);
    } else {
        treeView.setRelation(false);
        treeView = undefined;
        delete dataModel.pipeline; // restore original (shared) pipeline
        behavior.setData(); // reset with original pipeline
    }
}

var groupView, groupViewOn = false;
function toggleGrouping(){
    if (!groupView){
        groupView = new GroupView(grid, {});
        groupView.setPipeline({ includeSorter: true, includeFilter: true });
    }
    if (this.checked){
        grid.setGroups(groups);
        groupViewOn = true;
    } else {
        grid.setGroups([]);
        groupViewOn = false;
    }
}

最佳答案

你可以尝试:

(rollups.sum(11)).toFixed(2)

将数字括在括号中似乎可以使浏览器绕过标识符不能立即在数字文字之后开始的限制

编辑#2:

//all formatting and rendering per cell can be overridden in here
dataModel.getCell = function(config, rendererName) {
    if(aggViewOn)
    {
        if(config.columnName == "total_pets")
        {
            if(typeof(config.value) == 'number')
            {
                config.value = config.value.toFixed(2);
            }
            else if(config.value && config.value.length == 3 && typeof(config.value[1]) == 'number')
            {
                config.value = config.value[1].toFixed(2);
            }
        }
    } 
    return grid.cellRenderers.get(rendererName);
};

关于javascript:将函数的输出更改为指定的小数位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39909290/

相关文章:

Javascript parseInt 总是返回 NaN

javascript - jQuery 返回的对象的实际类型是什么

javascript - Angular JS : Pushing objects into an array. 它正在创建一个对象,然后是另一个数组。我需要它来创建单独的对象。这可能吗?

php - 将 MySQL 查询包装在 PHP 函数中

JavaScript:如何复制对象?

javascript - 在javascript中在 Canvas 中生成随机图像

javascript - `Cannot instantiate non-constructior` 关闭编译器警告?

javascript - XML 文档和 XML 字符串有什么区别?

ios - 如何在函数外更改字典中的 Double 值?

javascript - 如何在 JavaScript 中将 DOM 元素作为参数传递?