Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django - How to display Scientific Notation on Admin Page Field?

I have a field in my admin page that I'd like to display in Scientific Notation.

Right now it displays something ugly like this. How can I display this as 4.08E+13?

enter image description here

Right now I'm using a standard Decimal field in the model.

Any advice is greatly appreciated.

I'm on Django 1.2.

like image 545
Greg Avatar asked Aug 02 '11 13:08

Greg


2 Answers

You have to use %e to get the scientific notation format:

Basic Example:

x = 374.534  
print("%e" % x)
# 3.745340e+02

Precision of 2

x = 374.534
print("{0:.2E}".format(x))
# 3.75E+02

x = 12345678901234567890.534
print("{0:.2E}".format(x))
# 1.23E+19

Precision of 3

print("{0:.3E}".format(x))
# 1.235E+19
like image 97
Samuele Mattiuzzo Avatar answered Oct 06 '22 02:10

Samuele Mattiuzzo


Well, here's a work around since I can't figure out how to do this within the Django Python code. I have the admin pages run some custom javascript to do the conversion after the page is loaded.

Details:

Create this javascript file called "decimal_to_sci_not.js" and place it in your media directory:

/*
Finds and converts decimal fields > N into scientific notation.
*/

THRESHOLD = 100000;
PRECISION = 3;

function convert(val) {
    // ex. 100000 -> 1.00e+5
    return parseFloat(val).toPrecision(PRECISION);
}

function convert_input_fields() {
    var f_inputs = django.jQuery('input');
    f_inputs.each(function (index, domEl) {
        var jEl = django.jQuery(this);
        var old_val = parseFloat(jEl.val());
        if (old_val >= THRESHOLD) {
           jEl.val(convert(old_val));
        }
    });
}

function convert_table_cells() {
    //Look through all td elements and replace the first n.n number found inside
    //if greater than or equal to THRESHOLD
    var cells = django.jQuery('td');
    var re_num = /\d+\.\d+/m; //match any numbers w decimal
    cells.each(function (index, domEl) {
        var jEl = django.jQuery(this);
        var old_val_str = jEl.html().match(re_num);
        var old_val = parseFloat(old_val_str);
        if (old_val >= THRESHOLD) {
           jEl.html(jEl.html().replace(old_val_str,convert(old_val)));
        }
    });
}

django.jQuery(document).ready( function () {
    convert_input_fields();
    convert_table_cells();
});

Then update your admin.py code classes to include the javascript file:

class MyModel1Admin(admin.ModelAdmin):

    class Media:
        js = ['/media/decimal_to_sci_not.js']

admin.site.register(MyModel1,MyModel1Admin)
like image 31
Greg Avatar answered Oct 06 '22 02:10

Greg