src/cm/media/js/lib/flexible-js-formatting/numbers/number-functions.js
author Yves-Marie Haussonne <ymh.work+github@gmail.com>
Fri, 09 May 2014 18:35:26 +0200
changeset 656 a84519031134
parent 0 40c8f766c9b8
permissions -rw-r--r--
add link to "privacy policy" in the header test
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     1
/*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     2
 * Copyright (C) 2006 Baron Schwartz <baron at sequent dot org>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     3
 *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     4
 * This program is free software; you can redistribute it and/or modify it
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     5
 * under the terms of the GNU Lesser General Public License as published by the
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     6
 * Free Software Foundation, version 2.1.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     7
 *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     8
 * This program is distributed in the hope that it will be useful, but WITHOUT
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     9
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    10
 * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    11
 * details.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    12
 *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    13
 * $Revision: 1.3 $
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    14
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    15
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    16
// Abbreviations: LODP = Left Of Decimal Point, RODP = Right Of Decimal Point
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    17
Number.formatFunctions = {count:0};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    18
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    19
// Constants useful for controlling the format of numbers in special cases.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    20
Number.prototype.NaN         = 'NaN';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    21
Number.prototype.posInfinity = 'Infinity';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    22
Number.prototype.negInfinity = '-Infinity';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    23
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    24
Number.prototype.numberFormat = function(format, context) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    25
    if (isNaN(this) ) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    26
        return Number.prototype.NaNstring;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    27
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    28
    else if (this == +Infinity ) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    29
        return Number.prototype.posInfinity;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    30
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    31
    else if ( this == -Infinity) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    32
        return Number.prototype.negInfinity;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    33
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    34
    else if (Number.formatFunctions[format] == null) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    35
        Number.createNewFormat(format);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    36
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    37
    return this[Number.formatFunctions[format]](context);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    38
}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    39
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    40
Number.createNewFormat = function(format) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    41
    var funcName = "format" + Number.formatFunctions.count++;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    42
    Number.formatFunctions[format] = funcName;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    43
    var code = "Number.prototype." + funcName + " = function(context){\n";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    44
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    45
    // Decide whether the function is a terminal or a pos/neg/zero function
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    46
    var formats = format.split(";");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    47
    switch (formats.length) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    48
        case 1:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    49
            code += Number.createTerminalFormat(format);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    50
            break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    51
        case 2:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    52
            code += "return (this < 0) ? this.numberFormat(\""
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    53
                + String.escape(formats[1])
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    54
                + "\", 1) : this.numberFormat(\""
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    55
                + String.escape(formats[0])
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    56
                + "\", 2);";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    57
            break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    58
        case 3:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    59
            code += "return (this < 0) ? this.numberFormat(\""
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    60
                + String.escape(formats[1])
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    61
                + "\", 1) : ((this == 0) ? this.numberFormat(\""
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    62
                + String.escape(formats[2])
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    63
                + "\", 2) : this.numberFormat(\""
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    64
                + String.escape(formats[0])
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    65
                + "\", 3));";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    66
            break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    67
        default:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    68
            code += "throw 'Too many semicolons in format string';";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    69
            break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    70
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    71
    eval(code + "}");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    72
}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    73
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    74
Number.createTerminalFormat = function(format) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    75
    // If there is no work to do, just return the literal value
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    76
    if (format.length > 0 && format.search(/[0#?]/) == -1) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    77
        return "return '" + String.escape(format) + "';\n";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    78
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    79
    // Negative values are always displayed without a minus sign when section separators are used.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    80
    var code = "var val = (context == null) ? new Number(this) : Math.abs(this);\n";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    81
    var thousands = false;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    82
    var lodp = format;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    83
    var rodp = "";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    84
    var ldigits = 0;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    85
    var rdigits = 0;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    86
    var scidigits = 0;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    87
    var scishowsign = false;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    88
    var sciletter = "";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    89
    // Look for (and remove) scientific notation instructions, which can be anywhere
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    90
    m = format.match(/\..*(e)([+-]?)(0+)/i);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    91
    if (m) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    92
        sciletter = m[1];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    93
        scishowsign = (m[2] == "+");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    94
        scidigits = m[3].length;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    95
        format = format.replace(/(e)([+-]?)(0+)/i, "");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    96
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    97
    // Split around the decimal point
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    98
    var m = format.match(/^([^.]*)\.(.*)$/);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    99
    if (m) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   100
        lodp = m[1].replace(/\./g, "");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   101
        rodp = m[2].replace(/\./g, "");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   102
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   103
    // Look for %
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   104
    if (format.indexOf('%') >= 0) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   105
        code += "val *= 100;\n";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   106
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   107
    // Look for comma-scaling to the left of the decimal point
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   108
    m = lodp.match(/(,+)(?:$|[^0#?,])/);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   109
    if (m) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   110
        code += "val /= " + Math.pow(1000, m[1].length) + "\n;";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   111
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   112
    // Look for comma-separators
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   113
    if (lodp.search(/[0#?],[0#?]/) >= 0) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   114
        thousands = true;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   115
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   116
    // Nuke any extraneous commas
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   117
    if ((m) || thousands) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   118
        lodp = lodp.replace(/,/g, "");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   119
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   120
    // Figure out how many digits to the l/r of the decimal place
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   121
    m = lodp.match(/0[0#?]*/);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   122
    if (m) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   123
        ldigits = m[0].length;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   124
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   125
    m = rodp.match(/[0#?]*/);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   126
    if (m) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   127
        rdigits = m[0].length;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   128
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   129
    // Scientific notation takes precedence over rounding etc
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   130
    if (scidigits > 0) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   131
        code += "var sci = Number.toScientific(val,"
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   132
            + ldigits + ", " + rdigits + ", " + scidigits + ", " + scishowsign + ");\n"
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   133
            + "var arr = [sci.l, sci.r];\n";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   134
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   135
    else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   136
        // If there is no decimal point, round to nearest integer, AWAY from zero
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   137
        if (format.indexOf('.') < 0) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   138
            code += "val = (val > 0) ? Math.ceil(val) : Math.floor(val);\n";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   139
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   140
        // Numbers are rounded to the correct number of digits to the right of the decimal
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   141
        code += "var arr = val.round(" + rdigits + ").toFixed(" + rdigits + ").split('.');\n";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   142
        // There are at least "ldigits" digits to the left of the decimal, so add zeros if needed.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   143
        code += "arr[0] = (val < 0 ? '-' : '') + String.leftPad((val < 0 ? arr[0].substring(1) : arr[0]), "
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   144
            + ldigits + ", '0');\n";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   145
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   146
    // Add thousands separators
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   147
    if (thousands) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   148
        code += "arr[0] = Number.addSeparators(arr[0]);\n";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   149
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   150
    // Insert the digits into the formatting string.  On the LHS, extra digits are copied
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   151
    // into the result.  On the RHS, rounding has chopped them off.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   152
    code += "arr[0] = Number.injectIntoFormat(arr[0].reverse(), '"
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   153
        + String.escape(lodp.reverse()) + "', true).reverse();\n";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   154
    if (rdigits > 0) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   155
        code += "arr[1] = Number.injectIntoFormat(arr[1], '" + String.escape(rodp) + "', false);\n";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   156
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   157
    if (scidigits > 0) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   158
        code += "arr[1] = arr[1].replace(/(\\d{" + rdigits + "})/, '$1" + sciletter + "' + sci.s);\n";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   159
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   160
    return code + "return arr.join('.');\n";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   161
}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   162
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   163
Number.toScientific = function(val, ldigits, rdigits, scidigits, showsign) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   164
    var result = {l:"", r:"", s:""};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   165
    var ex = "";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   166
    // Make ldigits + rdigits significant figures
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   167
    var before = Math.abs(val).toFixed(ldigits + rdigits + 1).trim('0');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   168
    // Move the decimal point to the right of all digits we want to keep,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   169
    // and round the resulting value off
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   170
    var after = Math.round(new Number(before.replace(".", "").replace(
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   171
        new RegExp("(\\d{" + (ldigits + rdigits) + "})(.*)"), "$1.$2"))).toFixed(0);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   172
    // Place the decimal point in the new string
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   173
    if (after.length >= ldigits) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   174
        after = after.substring(0, ldigits) + "." + after.substring(ldigits);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   175
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   176
    else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   177
        after += '.';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   178
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   179
    // Find how much the decimal point moved.  This is #places to LODP in the original
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   180
    // number, minus the #places in the new number.  There are no left-padded zeroes in
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   181
    // the new number, so the calculation for it is simpler than for the old number.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   182
    result.s = (before.indexOf(".") - before.search(/[1-9]/)) - after.indexOf(".");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   183
    // The exponent is off by 1 when it gets moved to the left.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   184
    if (result.s < 0) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   185
        result.s++;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   186
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   187
    // Split the value around the decimal point and pad the parts appropriately.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   188
    result.l = (val < 0 ? '-' : '') + String.leftPad(after.substring(0, after.indexOf(".")), ldigits, "0");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   189
    result.r = after.substring(after.indexOf(".") + 1);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   190
    if (result.s < 0) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   191
        ex = "-";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   192
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   193
    else if (showsign) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   194
        ex = "+";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   195
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   196
    result.s = ex + String.leftPad(Math.abs(result.s).toFixed(0), scidigits, "0");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   197
    return result;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   198
}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   199
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   200
Number.prototype.round = function(decimals) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   201
    if (decimals > 0) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   202
        var m = this.toFixed(decimals + 1).match(
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   203
            new RegExp("(-?\\d*)\.(\\d{" + decimals + "})(\\d)\\d*$"));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   204
        if (m && m.length) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   205
            return new Number(m[1] + "." + String.leftPad(Math.round(m[2] + "." + m[3]), decimals, "0"));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   206
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   207
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   208
    return this;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   209
}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   210
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   211
Number.injectIntoFormat = function(val, format, stuffExtras) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   212
    var i = 0;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   213
    var j = 0;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   214
    var result = "";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   215
    var revneg = val.charAt(val.length - 1) == '-';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   216
    if ( revneg ) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   217
       val = val.substring(0, val.length - 1);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   218
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   219
    while (i < format.length && j < val.length && format.substring(i).search(/[0#?]/) >= 0) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   220
        if (format.charAt(i).match(/[0#?]/)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   221
            // It's a formatting character; copy the corresponding character
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   222
            // in the value to the result
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   223
            if (val.charAt(j) != '-') {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   224
                result += val.charAt(j);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   225
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   226
            else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   227
                result += "0";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   228
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   229
            j++;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   230
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   231
        else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   232
            result += format.charAt(i);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   233
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   234
        ++i;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   235
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   236
    if ( revneg && j == val.length ) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   237
        result += '-';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   238
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   239
    if (j < val.length) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   240
        if (stuffExtras) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   241
            result += val.substring(j);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   242
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   243
        if ( revneg ) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   244
             result += '-';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   245
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   246
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   247
    if (i < format.length) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   248
        result += format.substring(i);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   249
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   250
    return result.replace(/#/g, "").replace(/\?/g, " ");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   251
}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   252
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   253
Number.addSeparators = function(val) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   254
    return val.reverse().replace(/(\d{3})/g, "$1,").reverse().replace(/^(-)?,/, "$1");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   255
}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   256
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   257
String.prototype.reverse = function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   258
    var res = "";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   259
    for (var i = this.length; i > 0; --i) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   260
        res += this.charAt(i - 1);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   261
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   262
    return res;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   263
}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   264
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   265
String.prototype.trim = function(ch) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   266
    if (!ch) ch = ' ';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   267
    return this.replace(new RegExp("^" + ch + "+|" + ch + "+$", "g"), "");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   268
}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   269
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   270
String.leftPad = function (val, size, ch) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   271
    var result = new String(val);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   272
    if (ch == null) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   273
        ch = " ";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   274
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   275
    while (result.length < size) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   276
        result = ch + result;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   277
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   278
    return result;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   279
}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   280
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   281
String.escape = function(string) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   282
    return string.replace(/('|\\)/g, "\\$1");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   283
}