【问题标题】:Angular show decimal value as percentage [duplicate]角度将十进制值显示为百分比[重复]
【发布时间】:2021-10-10 00:09:39
【问题描述】:

我有一个显示百分比值并允许用户在 Angular 应用程序中更新它的数字文本框。

            <label for="fees">Fees %</label>
            <div class="input-group">
                <input type="number" class="form-control" id="fees" name="fees"
                 [(ngModel)]=feesPercentage">
                <div class="input-group-prepend">
                    <span class="input-group-text" id="FeesSign">%</span>
                </div>
            </div>

feesPercentage 在模型中存储为十进制值(例如 0.15)。是否有管道可用于在文本框中将值显示为百分比(例如 15),同时在模型中仍将值保持为小数。例如。如果用户将其从 15 更新为 16,我想将模型值更改为 0.16。我不需要在文本框中显示“%”符号。

【问题讨论】:

  • 在模型上使用 getter/setter 方法? get feesPercentageValue() { return this.feesPercentage * 100; } set feesPercentageValue(value) { this.feesPercentage = value / 100; }.
  • 感谢您的快速回复。它会工作,但我有很多这样的字段,所以寻找一个简单的解决方案(可能仅在 HTML 中)。
  • 对提议的副本的最高投票答案(以“这是否回答您的问题?”开头的评论)直接使用 HTML 中的代码...
  • 有人盲目地否决了这个相当好的问题。这违反了 SO 的使用条款,而且不好!

标签: javascript angular typescript


【解决方案1】:

管道是十进制管道:

https://angular.io/api/common/DecimalPipe

正常使用情况如下:

{{ (feesPercentage * 100) | number: '1:0-0' }}

1 表示在小数点前至少显示 1 位。

第一个0表示小数点后最少显示0位。

第二个0表示小数点后最多显示0位。

使用 GETTER

但我认为在您的情况下,管道可能不合适。而是尝试使用像这样的吸气剂:

在您的 .ts 文件中:

get feesPercentageAsInteger(): number {
  return Math.round(this.feesPercentage * 100)
}

然后在你的 HTML 中:

[ngModel]="feesPercentageAsInteger" 
(ngModelChange)="updateFeesPercentage($event)"

然后再次在您的 .ts 文件中:

updateFeesPercentage(value) {
  this.feesPercentage = parseInt(value, 10) / 100; // using parseInt here because I think value will be a string (but parseInt will also work if its a number)
}

使用自定义管道:

另一种可能的解决方案。而不是使用吸气剂,这可能会起作用:

[ngModel]="(feesPercentage * 100) | round" 
(ngModelChange)="updateFeesPercentage($event)"

然后再次在您的 .ts 文件中:

updateFeesPercentage(value) {
  this.feesPercentage = parseInt(value, 10) / 100;
}

您会注意到这里我使用了round 自定义管道。这样做的原因是因为你想要一个整数作为你的文本框。因此,您需要创建一个自定义管道来进行舍入(除非十进制数始终不超过 2dp),这对您来说应该很简单。它实际上需要一个数字并使用 Math.round 进行舍入并返回结果(在 CLI 中使用 ... ng generate pipe ... 创建管道)。然后有任何问题告诉我。它甚至可以在没有自定义管道的情况下工作,但我对此表示怀疑。

您可能面临的唯一问题是在将输入中的数字除以 100 时会丢失精度,这将为您提供 2dp 的小数(当您的原始数字可能包含超过 2dp 时)。如果此处担心精度损失,请考虑在设置之前调整updateFeesPercentage 函数以从feesPercentage 获取附加dps 的值(并在设置时将其附加到它)。

注意:使用 GETTER 方法时也会出现精度损失问题。

注意:同样,如果担心精度损失,那么在自定义圆管中使用 Math.floor 而不是 Math.round 将确保您不会丢失精度。

注意:在这里使用 step 属性会帮助你吗?可能不是,只是提醒一下...https://stackoverflow.com/a/22641142/1205871

【讨论】:

  • 感谢您的快速回复,如何在文本框中使用管道?
  • 我已经为此添加了详细信息。任何问题或问题都可以在这里评论,我会回复。
  • 感谢您的详细回答。它帮助我解决了很多问题,并为其他人提供了很多有用的信息。
猜你喜欢
  • 1970-01-01
  • 2017-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
  • 1970-01-01
  • 2017-01-16
  • 2016-05-01
相关资源
最近更新 更多