]> git.wh0rd.org - tt-rss.git/blobdiff - lib/dojo/number.js
lib: Upgrade Dojo and Dijit from 1.8.3 to 1.12.1
[tt-rss.git] / lib / dojo / number.js
index 30fcb6142bc04214884caf8d833ae0ee626ca9dd..2cb3bdd95c3111937bc1e5744e29e99af7edc8fd 100644 (file)
@@ -1,584 +1,8 @@
 /*
-       Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
+       Copyright (c) 2004-2016, The JS Foundation All Rights Reserved.
        Available via Academic Free License >= 2.1 OR the modified BSD license.
        see: http://dojotoolkit.org/license for details
 */
 
-
-if(!dojo._hasResource["dojo.number"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.number"] = true;
-dojo.provide("dojo.number");
-dojo.require("dojo.i18n");
-dojo.requireLocalization("dojo.cldr", "number", null, "ROOT,ar,ca,cs,da,de,el,en,en-au,en-gb,es,fi,fr,fr-ch,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-hant,zh-hk");
-dojo.require("dojo.string");
-dojo.require("dojo.regexp");
-
-dojo.getObject("number", true, dojo);
-
-/*=====
-dojo.number = {
-       // summary: localized formatting and parsing routines for Number
-}
-
-dojo.number.__FormatOptions = function(){
-       //      pattern: String?
-       //              override [formatting pattern](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
-       //              with this string.  Default value is based on locale.  Overriding this property will defeat
-       //              localization.  Literal characters in patterns are not supported.
-       //      type: String?
-       //              choose a format type based on the locale from the following:
-       //              decimal, scientific (not yet supported), percent, currency. decimal by default.
-       //      places: Number?
-       //              fixed number of decimal places to show.  This overrides any
-       //              information in the provided pattern.
-       //      round: Number?
-       //              5 rounds to nearest .5; 0 rounds to nearest whole (default). -1
-       //              means do not round.
-       //      locale: String?
-       //              override the locale used to determine formatting rules
-       //      fractional: Boolean?
-       //              If false, show no decimal places, overriding places and pattern settings.
-       this.pattern = pattern;
-       this.type = type;
-       this.places = places;
-       this.round = round;
-       this.locale = locale;
-       this.fractional = fractional;
-}
-=====*/
-
-dojo.number.format = function(/*Number*/value, /*dojo.number.__FormatOptions?*/options){
-       // summary:
-       //              Format a Number as a String, using locale-specific settings
-       // description:
-       //              Create a string from a Number using a known localized pattern.
-       //              Formatting patterns appropriate to the locale are chosen from the
-       //              [Common Locale Data Repository](http://unicode.org/cldr) as well as the appropriate symbols and
-       //              delimiters.
-       //              If value is Infinity, -Infinity, or is not a valid JavaScript number, return null.
-       // value:
-       //              the number to be formatted
-
-       options = dojo.mixin({}, options || {});
-       var locale = dojo.i18n.normalizeLocale(options.locale),
-               bundle = dojo.i18n.getLocalization("dojo.cldr", "number", locale);
-       options.customs = bundle;
-       var pattern = options.pattern || bundle[(options.type || "decimal") + "Format"];
-       if(isNaN(value) || Math.abs(value) == Infinity){ return null; } // null
-       return dojo.number._applyPattern(value, pattern, options); // String
-};
-
-//dojo.number._numberPatternRE = /(?:[#0]*,?)*[#0](?:\.0*#*)?/; // not precise, but good enough
-dojo.number._numberPatternRE = /[#0,]*[#0](?:\.0*#*)?/; // not precise, but good enough
-
-dojo.number._applyPattern = function(/*Number*/value, /*String*/pattern, /*dojo.number.__FormatOptions?*/options){
-       // summary:
-       //              Apply pattern to format value as a string using options. Gives no
-       //              consideration to local customs.
-       // value:
-       //              the number to be formatted.
-       // pattern:
-       //              a pattern string as described by
-       //              [unicode.org TR35](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
-       // options: dojo.number.__FormatOptions?
-       //              _applyPattern is usually called via `dojo.number.format()` which
-       //              populates an extra property in the options parameter, "customs".
-       //              The customs object specifies group and decimal parameters if set.
-
-       //TODO: support escapes
-       options = options || {};
-       var group = options.customs.group,
-               decimal = options.customs.decimal,
-               patternList = pattern.split(';'),
-               positivePattern = patternList[0];
-       pattern = patternList[(value < 0) ? 1 : 0] || ("-" + positivePattern);
-
-       //TODO: only test against unescaped
-       if(pattern.indexOf('%') != -1){
-               value *= 100;
-       }else if(pattern.indexOf('\u2030') != -1){
-               value *= 1000; // per mille
-       }else if(pattern.indexOf('\u00a4') != -1){
-               group = options.customs.currencyGroup || group;//mixins instead?
-               decimal = options.customs.currencyDecimal || decimal;// Should these be mixins instead?
-               pattern = pattern.replace(/\u00a4{1,3}/, function(match){
-                       var prop = ["symbol", "currency", "displayName"][match.length-1];
-                       return options[prop] || options.currency || "";
-               });
-       }else if(pattern.indexOf('E') != -1){
-               throw new Error("exponential notation not supported");
-       }
-       
-       //TODO: support @ sig figs?
-       var numberPatternRE = dojo.number._numberPatternRE;
-       var numberPattern = positivePattern.match(numberPatternRE);
-       if(!numberPattern){
-               throw new Error("unable to find a number expression in pattern: "+pattern);
-       }
-       if(options.fractional === false){ options.places = 0; }
-       return pattern.replace(numberPatternRE,
-               dojo.number._formatAbsolute(value, numberPattern[0], {decimal: decimal, group: group, places: options.places, round: options.round}));
-};
-
-dojo.number.round = function(/*Number*/value, /*Number?*/places, /*Number?*/increment){
-       //      summary:
-       //              Rounds to the nearest value with the given number of decimal places, away from zero
-       //      description:
-       //              Rounds to the nearest value with the given number of decimal places, away from zero if equal.
-       //              Similar to Number.toFixed(), but compensates for browser quirks. Rounding can be done by
-       //              fractional increments also, such as the nearest quarter.
-       //              NOTE: Subject to floating point errors.  See dojox.math.round for experimental workaround.
-       //      value:
-       //              The number to round
-       //      places:
-       //              The number of decimal places where rounding takes place.  Defaults to 0 for whole rounding.
-       //              Must be non-negative.
-       //      increment:
-       //              Rounds next place to nearest value of increment/10.  10 by default.
-       //      example:
-       //              >>> dojo.number.round(-0.5)
-       //              -1
-       //              >>> dojo.number.round(162.295, 2)
-       //              162.29  // note floating point error.  Should be 162.3
-       //              >>> dojo.number.round(10.71, 0, 2.5)
-       //              10.75
-       var factor = 10 / (increment || 10);
-       return (factor * +value).toFixed(places) / factor; // Number
-};
-
-if((0.9).toFixed() == 0){
-       // (isIE) toFixed() bug workaround: Rounding fails on IE when most significant digit
-       // is just after the rounding place and is >=5
-       (function(){
-               var round = dojo.number.round;
-               dojo.number.round = function(v, p, m){
-                       var d = Math.pow(10, -p || 0), a = Math.abs(v);
-                       if(!v || a >= d || a * Math.pow(10, p + 1) < 5){
-                               d = 0;
-                       }
-                       return round(v, p, m) + (v > 0 ? d : -d);
-               };
-       })();
-}
-
-/*=====
-dojo.number.__FormatAbsoluteOptions = function(){
-       //      decimal: String?
-       //              the decimal separator
-       //      group: String?
-       //              the group separator
-       //      places: Number?|String?
-       //              number of decimal places.  the range "n,m" will format to m places.
-       //      round: Number?
-       //              5 rounds to nearest .5; 0 rounds to nearest whole (default). -1
-       //              means don't round.
-       this.decimal = decimal;
-       this.group = group;
-       this.places = places;
-       this.round = round;
-}
-=====*/
-
-dojo.number._formatAbsolute = function(/*Number*/value, /*String*/pattern, /*dojo.number.__FormatAbsoluteOptions?*/options){
-       // summary:
-       //              Apply numeric pattern to absolute value using options. Gives no
-       //              consideration to local customs.
-       // value:
-       //              the number to be formatted, ignores sign
-       // pattern:
-       //              the number portion of a pattern (e.g. `#,##0.00`)
-       options = options || {};
-       if(options.places === true){options.places=0;}
-       if(options.places === Infinity){options.places=6;} // avoid a loop; pick a limit
-
-       var patternParts = pattern.split("."),
-               comma = typeof options.places == "string" && options.places.indexOf(","),
-               maxPlaces = options.places;
-       if(comma){
-               maxPlaces = options.places.substring(comma + 1);
-       }else if(!(maxPlaces >= 0)){
-               maxPlaces = (patternParts[1] || []).length;
-       }
-       if(!(options.round < 0)){
-               value = dojo.number.round(value, maxPlaces, options.round);
-       }
-
-       var valueParts = String(Math.abs(value)).split("."),
-               fractional = valueParts[1] || "";
-       if(patternParts[1] || options.places){
-               if(comma){
-                       options.places = options.places.substring(0, comma);
-               }
-               // Pad fractional with trailing zeros
-               var pad = options.places !== undefined ? options.places : (patternParts[1] && patternParts[1].lastIndexOf("0") + 1);
-               if(pad > fractional.length){
-                       valueParts[1] = dojo.string.pad(fractional, pad, '0', true);
-               }
-
-               // Truncate fractional
-               if(maxPlaces < fractional.length){
-                       valueParts[1] = fractional.substr(0, maxPlaces);
-               }
-       }else{
-               if(valueParts[1]){ valueParts.pop(); }
-       }
-
-       // Pad whole with leading zeros
-       var patternDigits = patternParts[0].replace(',', '');
-       pad = patternDigits.indexOf("0");
-       if(pad != -1){
-               pad = patternDigits.length - pad;
-               if(pad > valueParts[0].length){
-                       valueParts[0] = dojo.string.pad(valueParts[0], pad);
-               }
-
-               // Truncate whole
-               if(patternDigits.indexOf("#") == -1){
-                       valueParts[0] = valueParts[0].substr(valueParts[0].length - pad);
-               }
-       }
-
-       // Add group separators
-       var index = patternParts[0].lastIndexOf(','),
-               groupSize, groupSize2;
-       if(index != -1){
-               groupSize = patternParts[0].length - index - 1;
-               var remainder = patternParts[0].substr(0, index);
-               index = remainder.lastIndexOf(',');
-               if(index != -1){
-                       groupSize2 = remainder.length - index - 1;
-               }
-       }
-       var pieces = [];
-       for(var whole = valueParts[0]; whole;){
-               var off = whole.length - groupSize;
-               pieces.push((off > 0) ? whole.substr(off) : whole);
-               whole = (off > 0) ? whole.slice(0, off) : "";
-               if(groupSize2){
-                       groupSize = groupSize2;
-                       delete groupSize2;
-               }
-       }
-       valueParts[0] = pieces.reverse().join(options.group || ",");
-
-       return valueParts.join(options.decimal || ".");
-};
-
-/*=====
-dojo.number.__RegexpOptions = function(){
-       //      pattern: String?
-       //              override [formatting pattern](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
-       //              with this string.  Default value is based on locale.  Overriding this property will defeat
-       //              localization.
-       //      type: String?
-       //              choose a format type based on the locale from the following:
-       //              decimal, scientific (not yet supported), percent, currency. decimal by default.
-       //      locale: String?
-       //              override the locale used to determine formatting rules
-       //      strict: Boolean?
-       //              strict parsing, false by default.  Strict parsing requires input as produced by the format() method.
-       //              Non-strict is more permissive, e.g. flexible on white space, omitting thousands separators
-       //      places: Number|String?
-       //              number of decimal places to accept: Infinity, a positive number, or
-       //              a range "n,m".  Defined by pattern or Infinity if pattern not provided.
-       this.pattern = pattern;
-       this.type = type;
-       this.locale = locale;
-       this.strict = strict;
-       this.places = places;
-}
-=====*/
-dojo.number.regexp = function(/*dojo.number.__RegexpOptions?*/options){
-       //      summary:
-       //              Builds the regular needed to parse a number
-       //      description:
-       //              Returns regular expression with positive and negative match, group
-       //              and decimal separators
-       return dojo.number._parseInfo(options).regexp; // String
-};
-
-dojo.number._parseInfo = function(/*Object?*/options){
-       options = options || {};
-       var locale = dojo.i18n.normalizeLocale(options.locale),
-               bundle = dojo.i18n.getLocalization("dojo.cldr", "number", locale),
-               pattern = options.pattern || bundle[(options.type || "decimal") + "Format"],
-//TODO: memoize?
-               group = bundle.group,
-               decimal = bundle.decimal,
-               factor = 1;
-
-       if(pattern.indexOf('%') != -1){
-               factor /= 100;
-       }else if(pattern.indexOf('\u2030') != -1){
-               factor /= 1000; // per mille
-       }else{
-               var isCurrency = pattern.indexOf('\u00a4') != -1;
-               if(isCurrency){
-                       group = bundle.currencyGroup || group;
-                       decimal = bundle.currencyDecimal || decimal;
-               }
-       }
-
-       //TODO: handle quoted escapes
-       var patternList = pattern.split(';');
-       if(patternList.length == 1){
-               patternList.push("-" + patternList[0]);
-       }
-
-       var re = dojo.regexp.buildGroupRE(patternList, function(pattern){
-               pattern = "(?:"+dojo.regexp.escapeString(pattern, '.')+")";
-               return pattern.replace(dojo.number._numberPatternRE, function(format){
-                       var flags = {
-                               signed: false,
-                               separator: options.strict ? group : [group,""],
-                               fractional: options.fractional,
-                               decimal: decimal,
-                               exponent: false
-                               },
-
-                               parts = format.split('.'),
-                               places = options.places;
-
-                       // special condition for percent (factor != 1)
-                       // allow decimal places even if not specified in pattern
-                       if(parts.length == 1 && factor != 1){
-                           parts[1] = "###";
-                       }
-                       if(parts.length == 1 || places === 0){
-                               flags.fractional = false;
-                       }else{
-                               if(places === undefined){ places = options.pattern ? parts[1].lastIndexOf('0') + 1 : Infinity; }
-                               if(places && options.fractional == undefined){flags.fractional = true;} // required fractional, unless otherwise specified
-                               if(!options.places && (places < parts[1].length)){ places += "," + parts[1].length; }
-                               flags.places = places;
-                       }
-                       var groups = parts[0].split(',');
-                       if(groups.length > 1){
-                               flags.groupSize = groups.pop().length;
-                               if(groups.length > 1){
-                                       flags.groupSize2 = groups.pop().length;
-                               }
-                       }
-                       return "("+dojo.number._realNumberRegexp(flags)+")";
-               });
-       }, true);
-
-       if(isCurrency){
-               // substitute the currency symbol for the placeholder in the pattern
-               re = re.replace(/([\s\xa0]*)(\u00a4{1,3})([\s\xa0]*)/g, function(match, before, target, after){
-                       var prop = ["symbol", "currency", "displayName"][target.length-1],
-                               symbol = dojo.regexp.escapeString(options[prop] || options.currency || "");
-                       before = before ? "[\\s\\xa0]" : "";
-                       after = after ? "[\\s\\xa0]" : "";
-                       if(!options.strict){
-                               if(before){before += "*";}
-                               if(after){after += "*";}
-                               return "(?:"+before+symbol+after+")?";
-                       }
-                       return before+symbol+after;
-               });
-       }
-
-//TODO: substitute localized sign/percent/permille/etc.?
-
-       // normalize whitespace and return
-       return {regexp: re.replace(/[\xa0 ]/g, "[\\s\\xa0]"), group: group, decimal: decimal, factor: factor}; // Object
-};
-
-/*=====
-dojo.number.__ParseOptions = function(){
-       //      pattern: String?
-       //              override [formatting pattern](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
-       //              with this string.  Default value is based on locale.  Overriding this property will defeat
-       //              localization.  Literal characters in patterns are not supported.
-       //      type: String?
-       //              choose a format type based on the locale from the following:
-       //              decimal, scientific (not yet supported), percent, currency. decimal by default.
-       //      locale: String?
-       //              override the locale used to determine formatting rules
-       //      strict: Boolean?
-       //              strict parsing, false by default.  Strict parsing requires input as produced by the format() method.
-       //              Non-strict is more permissive, e.g. flexible on white space, omitting thousands separators
-       //      fractional: Boolean?|Array?
-       //              Whether to include the fractional portion, where the number of decimal places are implied by pattern
-       //              or explicit 'places' parameter.  The value [true,false] makes the fractional portion optional.
-       this.pattern = pattern;
-       this.type = type;
-       this.locale = locale;
-       this.strict = strict;
-       this.fractional = fractional;
-}
-=====*/
-dojo.number.parse = function(/*String*/expression, /*dojo.number.__ParseOptions?*/options){
-       // summary:
-       //              Convert a properly formatted string to a primitive Number, using
-       //              locale-specific settings.
-       // description:
-       //              Create a Number from a string using a known localized pattern.
-       //              Formatting patterns are chosen appropriate to the locale
-       //              and follow the syntax described by
-       //              [unicode.org TR35](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
-       //              Note that literal characters in patterns are not supported.
-       // expression:
-       //              A string representation of a Number
-       var info = dojo.number._parseInfo(options),
-               results = (new RegExp("^"+info.regexp+"$")).exec(expression);
-       if(!results){
-               return NaN; //NaN
-       }
-       var absoluteMatch = results[1]; // match for the positive expression
-       if(!results[1]){
-               if(!results[2]){
-                       return NaN; //NaN
-               }
-               // matched the negative pattern
-               absoluteMatch =results[2];
-               info.factor *= -1;
-       }
-
-       // Transform it to something Javascript can parse as a number.  Normalize
-       // decimal point and strip out group separators or alternate forms of whitespace
-       absoluteMatch = absoluteMatch.
-               replace(new RegExp("["+info.group + "\\s\\xa0"+"]", "g"), "").
-               replace(info.decimal, ".");
-       // Adjust for negative sign, percent, etc. as necessary
-       return absoluteMatch * info.factor; //Number
-};
-
-/*=====
-dojo.number.__RealNumberRegexpFlags = function(){
-       //      places: Number?
-       //              The integer number of decimal places or a range given as "n,m".  If
-       //              not given, the decimal part is optional and the number of places is
-       //              unlimited.
-       //      decimal: String?
-       //              A string for the character used as the decimal point.  Default
-       //              is ".".
-       //      fractional: Boolean?|Array?
-       //              Whether decimal places are used.  Can be true, false, or [true,
-       //              false].  Default is [true, false] which means optional.
-       //      exponent: Boolean?|Array?
-       //              Express in exponential notation.  Can be true, false, or [true,
-       //              false]. Default is [true, false], (i.e. will match if the
-       //              exponential part is present are not).
-       //      eSigned: Boolean?|Array?
-       //              The leading plus-or-minus sign on the exponent.  Can be true,
-       //              false, or [true, false].  Default is [true, false], (i.e. will
-       //              match if it is signed or unsigned).  flags in regexp.integer can be
-       //              applied.
-       this.places = places;
-       this.decimal = decimal;
-       this.fractional = fractional;
-       this.exponent = exponent;
-       this.eSigned = eSigned;
-}
-=====*/
-
-dojo.number._realNumberRegexp = function(/*dojo.number.__RealNumberRegexpFlags?*/flags){
-       // summary:
-       //              Builds a regular expression to match a real number in exponential
-       //              notation
-
-       // assign default values to missing parameters
-       flags = flags || {};
-       //TODO: use mixin instead?
-       if(!("places" in flags)){ flags.places = Infinity; }
-       if(typeof flags.decimal != "string"){ flags.decimal = "."; }
-       if(!("fractional" in flags) || /^0/.test(flags.places)){ flags.fractional = [true, false]; }
-       if(!("exponent" in flags)){ flags.exponent = [true, false]; }
-       if(!("eSigned" in flags)){ flags.eSigned = [true, false]; }
-
-       var integerRE = dojo.number._integerRegexp(flags),
-               decimalRE = dojo.regexp.buildGroupRE(flags.fractional,
-               function(q){
-                       var re = "";
-                       if(q && (flags.places!==0)){
-                               re = "\\" + flags.decimal;
-                               if(flags.places == Infinity){
-                                       re = "(?:" + re + "\\d+)?";
-                               }else{
-                                       re += "\\d{" + flags.places + "}";
-                               }
-                       }
-                       return re;
-               },
-               true
-       );
-
-       var exponentRE = dojo.regexp.buildGroupRE(flags.exponent,
-               function(q){
-                       if(q){ return "([eE]" + dojo.number._integerRegexp({ signed: flags.eSigned}) + ")"; }
-                       return "";
-               }
-       );
-
-       var realRE = integerRE + decimalRE;
-       // allow for decimals without integers, e.g. .25
-       if(decimalRE){realRE = "(?:(?:"+ realRE + ")|(?:" + decimalRE + "))";}
-       return realRE + exponentRE; // String
-};
-
-/*=====
-dojo.number.__IntegerRegexpFlags = function(){
-       //      signed: Boolean?
-       //              The leading plus-or-minus sign. Can be true, false, or `[true,false]`.
-       //              Default is `[true, false]`, (i.e. will match if it is signed
-       //              or unsigned).
-       //      separator: String?
-       //              The character used as the thousands separator. Default is no
-       //              separator. For more than one symbol use an array, e.g. `[",", ""]`,
-       //              makes ',' optional.
-       //      groupSize: Number?
-       //              group size between separators
-       //      groupSize2: Number?
-       //              second grouping, where separators 2..n have a different interval than the first separator (for India)
-       this.signed = signed;
-       this.separator = separator;
-       this.groupSize = groupSize;
-       this.groupSize2 = groupSize2;
-}
-=====*/
-
-dojo.number._integerRegexp = function(/*dojo.number.__IntegerRegexpFlags?*/flags){
-       // summary:
-       //              Builds a regular expression that matches an integer
-
-       // assign default values to missing parameters
-       flags = flags || {};
-       if(!("signed" in flags)){ flags.signed = [true, false]; }
-       if(!("separator" in flags)){
-               flags.separator = "";
-       }else if(!("groupSize" in flags)){
-               flags.groupSize = 3;
-       }
-
-       var signRE = dojo.regexp.buildGroupRE(flags.signed,
-               function(q){ return q ? "[-+]" : ""; },
-               true
-       );
-
-       var numberRE = dojo.regexp.buildGroupRE(flags.separator,
-               function(sep){
-                       if(!sep){
-                               return "(?:\\d+)";
-                       }
-
-                       sep = dojo.regexp.escapeString(sep);
-                       if(sep == " "){ sep = "\\s"; }
-                       else if(sep == "\xa0"){ sep = "\\s\\xa0"; }
-
-                       var grp = flags.groupSize, grp2 = flags.groupSize2;
-                       //TODO: should we continue to enforce that numbers with separators begin with 1-9?  See #6933
-                       if(grp2){
-                               var grp2RE = "(?:0|[1-9]\\d{0," + (grp2-1) + "}(?:[" + sep + "]\\d{" + grp2 + "})*[" + sep + "]\\d{" + grp + "})";
-                               return ((grp-grp2) > 0) ? "(?:" + grp2RE + "|(?:0|[1-9]\\d{0," + (grp-1) + "}))" : grp2RE;
-                       }
-                       return "(?:0|[1-9]\\d{0," + (grp-1) + "}(?:[" + sep + "]\\d{" + grp + "})*)";
-               },
-               true
-       );
-
-       return signRE + numberRE; // String
-};
-
-}
+//>>built
+define("dojo/number",["./_base/lang","./i18n","./i18n!./cldr/nls/number","./string","./regexp"],function(_1,_2,_3,_4,_5){var _6={};_1.setObject("dojo.number",_6);_6.format=function(_7,_8){_8=_1.mixin({},_8||{});var _9=_2.normalizeLocale(_8.locale),_a=_2.getLocalization("dojo.cldr","number",_9);_8.customs=_a;var _b=_8.pattern||_a[(_8.type||"decimal")+"Format"];if(isNaN(_7)||Math.abs(_7)==Infinity){return null;}return _6._applyPattern(_7,_b,_8);};_6._numberPatternRE=/[#0,]*[#0](?:\.0*#*)?/;_6._applyPattern=function(_c,_d,_e){_e=_e||{};var _f=_e.customs.group,_10=_e.customs.decimal,_11=_d.split(";"),_12=_11[0];_d=_11[(_c<0)?1:0]||("-"+_12);if(_d.indexOf("%")!=-1){_c*=100;}else{if(_d.indexOf("‰")!=-1){_c*=1000;}else{if(_d.indexOf("¤")!=-1){_f=_e.customs.currencyGroup||_f;_10=_e.customs.currencyDecimal||_10;_d=_d.replace(/([\s\xa0]*)(\u00a4{1,3})([\s\xa0]*)/,function(_13,_14,_15,_16){var _17=["symbol","currency","displayName"][_15.length-1],_18=_e[_17]||_e.currency||"";if(!_18){return "";}return _14+_18+_16;});}else{if(_d.indexOf("E")!=-1){throw new Error("exponential notation not supported");}}}}var _19=_6._numberPatternRE;var _1a=_12.match(_19);if(!_1a){throw new Error("unable to find a number expression in pattern: "+_d);}if(_e.fractional===false){_e.places=0;}return _d.replace(_19,_6._formatAbsolute(_c,_1a[0],{decimal:_10,group:_f,places:_e.places,round:_e.round}));};_6.round=function(_1b,_1c,_1d){var _1e=10/(_1d||10);return (_1e*+_1b).toFixed(_1c)/_1e;};if((0.9).toFixed()==0){var _1f=_6.round;_6.round=function(v,p,m){var d=Math.pow(10,-p||0),a=Math.abs(v);if(!v||a>=d){d=0;}else{a/=d;if(a<0.5||a>=0.95){d=0;}}return _1f(v,p,m)+(v>0?d:-d);};}_6._formatAbsolute=function(_20,_21,_22){_22=_22||{};if(_22.places===true){_22.places=0;}if(_22.places===Infinity){_22.places=6;}var _23=_21.split("."),_24=typeof _22.places=="string"&&_22.places.indexOf(","),_25=_22.places;if(_24){_25=_22.places.substring(_24+1);}else{if(!(_25>=0)){_25=(_23[1]||[]).length;}}if(!(_22.round<0)){_20=_6.round(_20,_25,_22.round);}var _26=String(Math.abs(_20)).split("."),_27=_26[1]||"";if(_23[1]||_22.places){if(_24){_22.places=_22.places.substring(0,_24);}var pad=_22.places!==undefined?_22.places:(_23[1]&&_23[1].lastIndexOf("0")+1);if(pad>_27.length){_26[1]=_4.pad(_27,pad,"0",true);}if(_25<_27.length){_26[1]=_27.substr(0,_25);}}else{if(_26[1]){_26.pop();}}var _28=_23[0].replace(",","");pad=_28.indexOf("0");if(pad!=-1){pad=_28.length-pad;if(pad>_26[0].length){_26[0]=_4.pad(_26[0],pad);}if(_28.indexOf("#")==-1){_26[0]=_26[0].substr(_26[0].length-pad);}}var _29=_23[0].lastIndexOf(","),_2a,_2b;if(_29!=-1){_2a=_23[0].length-_29-1;var _2c=_23[0].substr(0,_29);_29=_2c.lastIndexOf(",");if(_29!=-1){_2b=_2c.length-_29-1;}}var _2d=[];for(var _2e=_26[0];_2e;){var off=_2e.length-_2a;_2d.push((off>0)?_2e.substr(off):_2e);_2e=(off>0)?_2e.slice(0,off):"";if(_2b){_2a=_2b;_2b=undefined;}}_26[0]=_2d.reverse().join(_22.group||",");return _26.join(_22.decimal||".");};_6.regexp=function(_2f){return _6._parseInfo(_2f).regexp;};_6._parseInfo=function(_30){_30=_30||{};var _31=_2.normalizeLocale(_30.locale),_32=_2.getLocalization("dojo.cldr","number",_31),_33=_30.pattern||_32[(_30.type||"decimal")+"Format"],_34=_32.group,_35=_32.decimal,_36=1;if(_33.indexOf("%")!=-1){_36/=100;}else{if(_33.indexOf("‰")!=-1){_36/=1000;}else{var _37=_33.indexOf("¤")!=-1;if(_37){_34=_32.currencyGroup||_34;_35=_32.currencyDecimal||_35;}}}var _38=_33.split(";");if(_38.length==1){_38.push("-"+_38[0]);}var re=_5.buildGroupRE(_38,function(_39){_39="(?:"+_5.escapeString(_39,".")+")";return _39.replace(_6._numberPatternRE,function(_3a){var _3b={signed:false,separator:_30.strict?_34:[_34,""],fractional:_30.fractional,decimal:_35,exponent:false},_3c=_3a.split("."),_3d=_30.places;if(_3c.length==1&&_36!=1){_3c[1]="###";}if(_3c.length==1||_3d===0){_3b.fractional=false;}else{if(_3d===undefined){_3d=_30.pattern?_3c[1].lastIndexOf("0")+1:Infinity;}if(_3d&&_30.fractional==undefined){_3b.fractional=true;}if(!_30.places&&(_3d<_3c[1].length)){_3d+=","+_3c[1].length;}_3b.places=_3d;}var _3e=_3c[0].split(",");if(_3e.length>1){_3b.groupSize=_3e.pop().length;if(_3e.length>1){_3b.groupSize2=_3e.pop().length;}}return "("+_6._realNumberRegexp(_3b)+")";});},true);if(_37){re=re.replace(/([\s\xa0]*)(\u00a4{1,3})([\s\xa0]*)/g,function(_3f,_40,_41,_42){var _43=["symbol","currency","displayName"][_41.length-1],_44=_5.escapeString(_30[_43]||_30.currency||"");if(!_44){return "";}_40=_40?"[\\s\\xa0]":"";_42=_42?"[\\s\\xa0]":"";if(!_30.strict){if(_40){_40+="*";}if(_42){_42+="*";}return "(?:"+_40+_44+_42+")?";}return _40+_44+_42;});}return {regexp:re.replace(/[\xa0 ]/g,"[\\s\\xa0]"),group:_34,decimal:_35,factor:_36};};_6.parse=function(_45,_46){var _47=_6._parseInfo(_46),_48=(new RegExp("^"+_47.regexp+"$")).exec(_45);if(!_48){return NaN;}var _49=_48[1];if(!_48[1]){if(!_48[2]){return NaN;}_49=_48[2];_47.factor*=-1;}_49=_49.replace(new RegExp("["+_47.group+"\\s\\xa0"+"]","g"),"").replace(_47.decimal,".");return _49*_47.factor;};_6._realNumberRegexp=function(_4a){_4a=_4a||{};if(!("places" in _4a)){_4a.places=Infinity;}if(typeof _4a.decimal!="string"){_4a.decimal=".";}if(!("fractional" in _4a)||/^0/.test(_4a.places)){_4a.fractional=[true,false];}if(!("exponent" in _4a)){_4a.exponent=[true,false];}if(!("eSigned" in _4a)){_4a.eSigned=[true,false];}var _4b=_6._integerRegexp(_4a),_4c=_5.buildGroupRE(_4a.fractional,function(q){var re="";if(q&&(_4a.places!==0)){re="\\"+_4a.decimal;if(_4a.places==Infinity){re="(?:"+re+"\\d+)?";}else{re+="\\d{"+_4a.places+"}";}}return re;},true);var _4d=_5.buildGroupRE(_4a.exponent,function(q){if(q){return "([eE]"+_6._integerRegexp({signed:_4a.eSigned})+")";}return "";});var _4e=_4b+_4c;if(_4c){_4e="(?:(?:"+_4e+")|(?:"+_4c+"))";}return _4e+_4d;};_6._integerRegexp=function(_4f){_4f=_4f||{};if(!("signed" in _4f)){_4f.signed=[true,false];}if(!("separator" in _4f)){_4f.separator="";}else{if(!("groupSize" in _4f)){_4f.groupSize=3;}}var _50=_5.buildGroupRE(_4f.signed,function(q){return q?"[-+]":"";},true);var _51=_5.buildGroupRE(_4f.separator,function(sep){if(!sep){return "(?:\\d+)";}sep=_5.escapeString(sep);if(sep==" "){sep="\\s";}else{if(sep==" "){sep="\\s\\xa0";}}var grp=_4f.groupSize,_52=_4f.groupSize2;if(_52){var _53="(?:0|[1-9]\\d{0,"+(_52-1)+"}(?:["+sep+"]\\d{"+_52+"})*["+sep+"]\\d{"+grp+"})";return ((grp-_52)>0)?"(?:"+_53+"|(?:0|[1-9]\\d{0,"+(grp-1)+"}))":_53;}return "(?:0|[1-9]\\d{0,"+(grp-1)+"}(?:["+sep+"]\\d{"+grp+"})*)";},true);return _50+_51;};return _6;});
\ No newline at end of file