|
9 | 9 | * and GPL (GPL-LICENSE.txt) licenses.
|
10 | 10 | *
|
11 | 11 | * @author Michael Abernethy, Andrew Parry
|
12 |
| - * @version 1.2.2-RELEASE ($Id$) |
| 12 | + * @version 1.2.3-SNAPSHOT ($Id$) |
13 | 13 | *
|
14 | 14 | * Dependencies
|
15 | 15 | *
|
|
127 | 127 | }
|
128 | 128 | };
|
129 | 129 |
|
130 |
| - function formatCodes(locale) { |
| 130 | + function formatCodes(locale, isFullLocale) { |
131 | 131 | if (nfLocales.size() == 0)
|
132 | 132 | init();
|
133 | 133 |
|
134 | 134 | // default values
|
135 | 135 | var dec = ".";
|
136 | 136 | var group = ",";
|
137 | 137 | var neg = "-";
|
138 |
| - |
| 138 | + |
| 139 | + if (isFullLocale == false) { |
| 140 | + // Extract and convert to lower-case any language code from a real 'locale' formatted string, if not use as-is |
| 141 | + // (To prevent locale format like : "fr_FR", "en_US", "de_DE", "fr_FR", "en-US", "de-DE") |
| 142 | + if (locale.indexOf('_') != -1) |
| 143 | + locale = locale.split('_')[1].toLowerCase(); |
| 144 | + else if (locale.indexOf('-') != -1) |
| 145 | + locale = locale.split('-')[1].toLowerCase(); |
| 146 | + } |
| 147 | + |
139 | 148 | // hashtable lookup to match locale with codes
|
140 | 149 | var codesIndex = nfLocales.get(locale);
|
141 | 150 | if (codesIndex) {
|
|
201 | 210 | */
|
202 | 211 | jQuery.formatNumber = function(numberString, options){
|
203 | 212 | var options = jQuery.extend({}, jQuery.fn.formatNumber.defaults, options);
|
204 |
| - var formatData = formatCodes(options.locale.toLowerCase()); |
| 213 | + var formatData = formatCodes(options.locale.toLowerCase(), options.isFullLocale); |
205 | 214 |
|
206 | 215 | var dec = formatData.dec;
|
207 | 216 | var group = formatData.group;
|
|
254 | 263 | */
|
255 | 264 | jQuery._formatNumber = function(number, options, suffix, prefix, negativeInFront) {
|
256 | 265 | var options = jQuery.extend({}, jQuery.fn.formatNumber.defaults, options);
|
257 |
| - var formatData = formatCodes(options.locale.toLowerCase()); |
| 266 | + var formatData = formatCodes(options.locale.toLowerCase(), options.isFullLocale); |
258 | 267 |
|
259 | 268 | var dec = formatData.dec;
|
260 | 269 | var group = formatData.group;
|
|
336 | 345 | }
|
337 | 346 | }
|
338 | 347 |
|
339 |
| - // account for any pre-data 0's |
| 348 | + // account for any pre-data padding |
340 | 349 | if (onesFormat.length > onePortion.length) {
|
341 | 350 | var padStart = onesFormat.indexOf('0');
|
342 | 351 | if (padStart != -1) {
|
343 | 352 | var padLen = onesFormat.length - padStart;
|
344 | 353 |
|
345 |
| - // pad to left with 0's |
| 354 | + // pad to left with 0's or group char |
| 355 | + var pos = onesFormat.length - onePortion.length - 1; |
346 | 356 | while (onePortion.length < padLen) {
|
347 |
| - onePortion = '0' + onePortion; |
| 357 | + var padChar = onesFormat.charAt(pos); |
| 358 | + // replace with real group char if needed |
| 359 | + if (padChar == ',') |
| 360 | + padChar = group; |
| 361 | + onePortion = padChar + onePortion; |
| 362 | + pos--; |
348 | 363 | }
|
349 | 364 | }
|
350 | 365 | }
|
|
415 | 430 | */
|
416 | 431 | jQuery.parseNumber = function(numberString, options) {
|
417 | 432 | var options = jQuery.extend({}, jQuery.fn.parseNumber.defaults, options);
|
418 |
| - var formatData = formatCodes(options.locale.toLowerCase()); |
| 433 | + var formatData = formatCodes(options.locale.toLowerCase(), options.isFullLocale); |
419 | 434 |
|
420 | 435 | var dec = formatData.dec;
|
421 | 436 | var group = formatData.group;
|
|
429 | 444 | numberString = numberString.replace(dec,".").replace(neg,"-");
|
430 | 445 | var validText = "";
|
431 | 446 | var hasPercent = false;
|
432 |
| - if (numberString.charAt(numberString.length-1)=="%") |
| 447 | + if (numberString.charAt(numberString.length - 1) == "%" || options.isPercentage == true) |
433 | 448 | hasPercent = true;
|
434 | 449 | for (var i=0; i<numberString.length; i++) {
|
435 | 450 | if (valid.indexOf(numberString.charAt(i))>-1)
|
|
438 | 453 | var number = new Number(validText);
|
439 | 454 | if (hasPercent) {
|
440 | 455 | number = number / 100;
|
441 |
| - number = number.toFixed(validText.length-1); |
| 456 | + var decimalPos = validText.indexOf('.'); |
| 457 | + if (decimalPos != -1) { |
| 458 | + var decimalPoints = validText.length - decimalPos - 1; |
| 459 | + number = number.toFixed(decimalPoints + 2); |
| 460 | + } else { |
| 461 | + number = number.toFixed(validText.length - 1); |
| 462 | + } |
442 | 463 | }
|
443 | 464 |
|
444 | 465 | return number;
|
445 | 466 | };
|
446 | 467 |
|
447 | 468 | jQuery.fn.parseNumber.defaults = {
|
448 | 469 | locale: "us",
|
449 |
| - decimalSeparatorAlwaysShown: false |
| 470 | + decimalSeparatorAlwaysShown: false, |
| 471 | + isPercentage: false, |
| 472 | + isFullLocale: false |
450 | 473 | };
|
451 | 474 |
|
452 | 475 | jQuery.fn.formatNumber.defaults = {
|
453 | 476 | format: "#,###.00",
|
454 | 477 | locale: "us",
|
455 | 478 | decimalSeparatorAlwaysShown: false,
|
456 | 479 | nanForceZero: true,
|
457 |
| - round: true |
| 480 | + round: true, |
| 481 | + isFullLocale: false |
458 | 482 | };
|
459 | 483 |
|
460 | 484 | Number.prototype.toFixed = function(precision) {
|
461 |
| - return $._roundNumber(this, precision); |
| 485 | + return jQuery._roundNumber(this, precision); |
462 | 486 | };
|
463 | 487 |
|
464 | 488 | jQuery._roundNumber = function(number, decimalPlaces) {
|
|
0 commit comments