Можно ли интернационализировать числовые входы AngularJS?

Мы пытаемся интернационализировать значения AngularJS <input type='number' />.

Мы включили файл локализации (например, angular-locale_it-it.js), но значения по-прежнему отображаются с использованием английского языка.

Это проблема, потому что наш внутренний сервер (и управление) ожидает, что числовые значения будут в пользовательской локали, а получение 123.45 вместо 123,45 приведет к ошибке.

Вы можете найти пример в jsFiddle.

Он работает в Chrome 27

Screenshot of the result in Chrome

но он не работает в Firefox 21 и Internet Explorer 10.

Screenshot of the result in Firefox

Ответ 1

Это может быть не тот ответ, который вы хотите, но, возможно, это немного поможет вам:

JsBin: http://jsbin.com/iyulaj/1/

Используя директиву, вы можете взять данные ввода, проанализировать его и затем поместить в переменную $scope. Пожалуйста, смотрите: http://docs.angularjs.org/api/ng.directive:ngModel.NgModelController ($parsersи $formatters) Я взял его из Использование углового фильтра в элементе ввода).

Директива может искать запятую и заменять ее точкой. Это может выглядеть так:

angular.module('MyModule').directive('numberinput', function () {
    return {
        restrict: 'A',
        require: 'ngModel',
        link: function(scope, element, attrs, ngModelController) {

            ngModelController.$parsers.push(function(data) {
                //convert data from view format to model format
                return data.replace(',', "."); //converted
            });

            ngModelController.$formatters.push(function(data) {
                //convert data from model format to view format
                return data.replace('.', ","); //converted
            });

            // http://docs.angularjs.org/api/ng.directive:ngModel.NgModelController

        }
    };
});

Поле ввода:

<input ng-model='value' type='text' numberinput='' />

Также обратите внимание, что ввод теперь представляет собой текстовое поле. Посмотрите на это: http://jsbin.com/iyurol/1/

Ввод - это числовое поле. Но введите 11,5, и он выведет ùndefined (обратите внимание, что я живу в Германии, и мы используем запятую). Таким образом, браузер не "разбирает" номер правильно, если он не в точечной нотации, даже если вы живете в регионах с запятой-нотацией...

Пожалуйста, поправьте меня, если в этом что-то не так;)

Ответ 3

Как тип данных, которые нужно отформатировать, обычно это число, не нужно ли преобразовывать число в строку перед вызовом replace()? Я получил ошибку, когда данные модели имеют числовое значение. Следующее работает лучше:

      ngModelController.$formatters.push(function(data) {
          //convert data from model format to view format
          return (''+data).replace('.', ","); //converted
      });