2015-08-28 8 views
1

я имел следующий код для добавления пользовательских функций с помощью Globalize 0.x:Правильный путь расширения в Globalize 1.x

Globalize.parseFloatAcceptDotAndComma = 
    function (value, radix, cultureSelector) { 
     value = value.replace(Globalize.locale(lang).numberFormat['.'] === '.' ? ',' : '.', Globalize.locale(lang).numberFormat['.']); 
       return Globalize.parseFloat.call(this, value, radix, cultureSelector); 
} 

Поскольку API Globalize 1 плагиной отличается, я стремлюсь знать как добиться такого же результата в новой версии плагина?

Спасибо.

BTW, я включил этот метод в цепочку «then» после «then (Globalize.load)» - это правильный способ?

UPDATE: окончательная рабочая версия - благодаря @rxaviers

var lang = '@Thread.CurrentThread.CurrentUICulture.Name'; 

    Promise.all([ 
     // Core 
     fetch('/Scripts/cldr/supplemental/likelySubtags.json'), 

     // Date 
     fetch('/Scripts/cldr/main/' + lang + '/ca-gregorian.json'), 
     fetch('/Scripts/cldr/main/' + lang + '/timeZoneNames.json'), 
     fetch('/Scripts/cldr/supplemental/timeData.json'), 
     fetch('/Scripts/cldr/supplemental/weekData.json'), 

     // Number 
     fetch('/Scripts/cldr/main/' + lang + '/numbers.json'), 
     fetch('/Scripts/cldr/supplemental/numberingSystems.json') 
    ]) 
    .then(function(responses) { 
     return Promise.all(responses.map(function(response) { 
      return response.json(); 
     })); 
    }) 
    .then(Globalize.load) 
    .then(function() { 
      Globalize.parseFloatAcceptDotAndComma = 
      Globalize.prototype.parseFloatAcceptDotAndComma = function(value, options) { 
      // Assert that value and options are valid. 
      // Assert that this.cldr is present 

      if (value.indexOf('.') >= 0 && value.indexOf(',') >= 0) { 
       throw new Error('Both separators are present'); 
      } 

      value = value.replace(/[,.]/, this.cldr.main('numbers/symbols-numberSystem-latn/decimal')); 
      return this.parseNumber(value, options); 
     } 
    }) 
    .then(function() { Globalize.locale(lang); }); 

ответ

1

Примечание ваше решение не будет обрабатывать арабский и другие языки, которые используются различные цифры, чем латинские. Поэтому я не рекомендую его. Я считаю, что должен быть лучший алгоритм, чем этот.

Для общих целей, показывающий, как расширить класс Globalize, здесь мы идем:

Во-первых, убедитесь, что вы включили основные и цифровые модули. Затем, вы можете:

Globalize.parseFloatAcceptDotAndComma = 
Globalize.prototype.parseFloatAcceptDotAndComma = function(value, options) { 
    // Assert that value and options are valid. 
    // Assert that this.cldr is present 

    // I guess you should throw when both . and , are present. 
    if (value.indexOf(".") >= 0 && value.indexOf(",") >= 0) { 
     throw new Error("Whops"); 
    } 

    // Important: 
    // Note your solution won't handle Arabic and other languages that 
    // uses different digits than latin. Therefore, I DO NOT personally 
    // recommend it. 

    value = value.replace(/[,.]/, this.cldr.main("numbers/symbols-numberSystem-latn/decimal")); 
    return this.parseNumber(value, options); 
}; 

Вы сможете использовать его как:

Globalize.locale("en"); 
Globalize.parseFloatAcceptDotAndComma("3,14"); 

// Or 
var en = new Globalize("en"); 
en.parseFloatAcceptDotAndComma("3,14"); 
+0

* Рафаэль *, спасибо. Yeap, я знаю, что это ограниченное решение с разделителями, это всего лишь конкретный случай, клиент попросил обработать те, и приложение поддерживает только норвежский и английский. – Alexander

+1

О вашей окончательной рабочей версии ... Вы можете определить 'parseFloatAcceptDotAndComma' вне области ваших обещаний. Хотя, вы захотите сохранить свои обещания во всем остальном (a) получить CLDR, затем (b) загрузить CLDR и использовать Globalize. –

Смежные вопросы