【问题标题】:AngularJS decimal input: change comma to dotAngularJS十进制输入:将逗号更改为点
【发布时间】:2015-03-16 12:47:40
【问题描述】:

我正在使用FCSA Number 处理 AngularJS 中的十进制输入。

如果我使用maxDecimals 选项,它几乎可以按预期工作。对于两位小数,“100.333”等输入将转换为“100.33”。

在我的地区,逗号用作小数分隔符,但我网站上的输入应使用点作为小数分隔符——就像这个插件一样。没关系。但是,我希望将“100,33”之类的输入转换为“100.33”。

我该怎么做?

【问题讨论】:

    标签: angularjs


    【解决方案1】:

    恐怕我对FCSA number不熟悉:(

    但是,如果您的目标是了解如何实现一个简单面向角度的解决方案,它可能很适合您的需求,请继续阅读... 您将在下面找到我在 plunker 中实现的 price 指令。它非常简单,我建议您花时间研究它,然后实施您自己的解决方案,并受到price 指令和FCSA 源代码的启发。


    1. filter 将逗号数字转换为十进制数字:

      app.filter('comma2decimal', [
      function() { // should be altered to suit your needs
          return function(input) {
          var ret=(input)?input.toString().trim().replace(",","."):null;
              return parseFloat(ret);
          };
      }]);
      

    此过滤器会自动将数据从视图格式(带逗号)转换为模型格式(您的范围,带小数)。


    1. filter 将十进制数字转换为逗号数字:

      app.filter('decimal2comma', [
      function() {// should be altered to suit your needs
          return function(input) {
              var ret=(input)?input.toString().replace(".",","):null;
              if(ret){
                  var decArr=ret.split(",");
                  if(decArr.length>1){
                      var dec=decArr[1].length;
                      if(dec===1){ret+="0";}
                  }//this is to show prices like 12,20 and not 12,2
              }
              return ret;
          };
      }]);
      

    此过滤器将自动将数据从模型格式(您的范围,带小数点)转换为视图格式(您的视图,带逗号)。


    1. 一个名为 pricedirective 使用这两个过滤器:

      app.directive('price', ['$filter',
      function($filter) {
      return {
          restrict:'A',
          require: 'ngModel',
          link: function(scope, element, attrs, ngModelController) {
              ngModelController.$parsers.push(function(data) {
                  //convert data from view format to model format
      
                  data=$filter('comma2decimal')(data);
      
                  return data;
              });
      
              ngModelController.$formatters.push(function(data) {
                  //convert data from model format to view format
      
                  data=$filter('decimal2comma')(data);
      
                  return data;
              });
          }
      };}]);
      

    参见this working plunker,展示一切如何协同工作。

    最初,一个数字(例如来自数据库)在控制器范围内具有十进制值 ($scope.price=25.36;);

    在视图中,它看起来像:输入中的 25,36,以及数据库中的 25.36,如下所示。

    现在输入任何逗号数字:它会自动转换为十进制数以插入数据库。

    希望这能回答你的问题。


    使用指令的优势:它是可重复使用的,在您网站上任何需要它的地方都可以使用。

    使用两个过滤器的优势:关注点分离。


    这种方法允许用户在您的视图中使用他们最常用的数字。 但是,输入的数字可以在插入数据库之前在后台进行更改,因此它们的格式正确。

    当您从数据库中获取价格/数字时,它们会自动更改,然后以更适合读者的方式显示在视图中。

    如果您需要 FCSA Number 指令中的其他选项,您可以轻松地将它们添加到您的过滤器中。

    您可能需要自定义函数和模型验证,使用ngModelCtrl.$setValidity

    【讨论】:

    • 请注意,此过滤器将为 0 返回 null。这意味着如果您的模型设置为值 0,则角度将其显示为 null(空字段)。使用var ret=(input != void(0))?[...] 也显示0。
    • 看看@Sebastian Hindberg Berg 的答案!
    【解决方案2】:

    添加您对应的语言环境:

    <script type="application/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/angular-i18n/1.5.0/angular-locale_en-us.min.js"></script>
    

    您可以在此处查看可用语言环境列表:https://cdnjs.com/libraries/angular-i18n

    【讨论】:

    • 这应该是正确且更标准的答案
    • 对于法裔加拿大人,请确保选择 fr-ca 选项,而不是 ca-fr。如果你选择这个,它会给你一个欧洲货币。
    • 这是更简单正确的答案!不是解决方法
    【解决方案3】:

    您只需要使用 angular number 过滤器并更改 angular 的默认分隔符和组字符。

    app.run(["$locale", function ($locale) {
        $locale.NUMBER_FORMATS.GROUP_SEP = " ";
        $locale.NUMBER_FORMATS.DECIMAL_SEP = ".";
    }]);

    然后在你的 HTML 中:

    &lt;p&gt;{{ the_number | number:0 }}&lt;/p&gt;

    【讨论】:

    • 你能举例说明如何在 ionic 3 上实现这个吗?例如在 .ts?
    • 对于南非货币 (ZAR),在我的指令中,我必须添加以上内容以获取 ng-currency - 它使用角度格式化程序 - 以官方格式显示货币:$locale.NUMBER_FORMATS .DECIMAL_SEP = ","; $locale.NUMBER_FORMATS.GROUP_SEP = "";这让我可以使用 ng-currency 而不必破解无法可靠使用的语言环境。
    【解决方案4】:

    我使用了一种非正统的解决方案。在 Angular 的 .js 中,我查找了“DECIMAL_SEP”并进行了更改:

    DECIMAL_SEP:".",GROUP_SEP:","
    

    DECIMAL_SEP:",",GROUP_SEP:"."
    

    而且它有效!不是最好的解决方案,但它有效......我只是想帮忙。

    PS。我来自哥伦比亚,如果我的英语不好,请见谅。

    【讨论】:

      【解决方案5】:

      更短的方式:

      app.filter('commaToDecimal', function(){
          return function(value) {
              return value ? parseFloat(value).toFixed(2).toString().replace('.', ',') : null;
          };
      });
      

      【讨论】:

        【解决方案6】:

        解决方案:

        .filter('dot2comma', [
          function() {
            return function(value) {
              return value.toString().replace(/\./g,',');
            };
          }]);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-09-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-02
          • 2012-08-07
          • 1970-01-01
          相关资源
          最近更新 更多