📄 number.js
字号:
var bundle = dojo.i18n.getLocalization("dojo.cldr", "number", locale); var pattern = options.pattern || bundle[(options.type || "decimal") + "Format"];//TODO: memoize? var group = bundle.group; var decimal = bundle.decimal; var 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}; var parts = format.split('.'); var places = options.places; if(parts.length == 1 || places === 0){flags.fractional = false;} else{ if(places === undefined){ places = parts[1].lastIndexOf('0')+1; } 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*)(\u00a4{1,3})(\s*)/g, function(match, before, target, after){ var prop = ["symbol", "currency", "displayName"][target.length-1]; var symbol = dojo.regexp.escapeString(options[prop] || options.currency || ""); before = before ? "\\s" : ""; after = after ? "\\s" : ""; 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 pattern with this string. Default is provided based on // locale. // type: String? // choose a format type based on the locale from the following: // decimal, scientific, percent, currency. decimal by default. // locale: String // override the locale used to determine formatting rules // strict: Boolean? // strict parsing, false by default // currency: Object // object with currency information this.pattern = pattern; this.type = type; this.locale = locale; this.strict = strict; this.currency = currency;}=====*/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) // expression: // A string representation of a Number var info = dojo.number._parseInfo(options); var 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 Number(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 allowed. Can be true, false, or [true, // false]. Default is [true, false] // 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 paramters 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]; } // integer RE var integerRE = dojo.number._integerRegexp(flags); // decimal RE var 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 ); // exponent RE var exponentRE = dojo.regexp.buildGroupRE(flags.exponent, function(q){ if(q){ return "([eE]" + dojo.number._integerRegexp({ signed: flags.eSigned}) + ")"; } return ""; } ); // real number RE 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 paramters flags = flags || {}; if(!("signed" in flags)){ flags.signed = [true, false]; } if(!("separator" in flags)){ flags.separator = ""; }else if(!("groupSize" in flags)){ flags.groupSize = 3; } // build sign RE var signRE = dojo.regexp.buildGroupRE(flags.signed, function(q) { return q ? "[-+]" : ""; }, true ); // number RE var numberRE = dojo.regexp.buildGroupRE(flags.separator, function(sep){ if(!sep){ return "(?:0|[1-9]\\d*)"; } sep = dojo.regexp.escapeString(sep); if(sep == " "){ sep = "\\s"; } else if(sep == "\xa0"){ sep = "\\s\\xa0"; } var grp = flags.groupSize, grp2 = flags.groupSize2; 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 ); // integer RE return signRE + numberRE; // String}}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -