Angular 如何在typescript中截断数字

Angular 如何在typescript中截断数字,angular,Angular,我试图使用Angular with TypeScript在HTML文件中执行此操作:{{{(I/5)%3} 问题是当i/5不返回自然数时,它无法继续操作%3部件。因此,问题是:如何截断I/5,以获得可接受的操作结果 顺便说一句,我试图使用JavaScript函数Math.trunc(I/5),但我得到一个错误,它说: '无法读取未定义的属性trunc' 我不能理解这个问题。不过,你可以试试 数学楼层(i/5)%3。当你除以一个负数时,这将给出错误的结果。我不能理解这个问题。不过,你可以试试 数学

我试图使用Angular with TypeScript在HTML文件中执行此操作:
{{{(I/5)%3}

问题是当
i/5
不返回自然数时,它无法继续操作
%3
部件。因此,问题是:如何截断
I/5
,以获得可接受的操作结果

顺便说一句,我试图使用JavaScript函数
Math.trunc(I/5)
,但我得到一个错误,它说:

'无法读取未定义的属性trunc'


我不能理解这个问题。不过,你可以试试
数学楼层(i/5)%3
。当你除以一个负数时,这将给出错误的结果。

我不能理解这个问题。不过,你可以试试
数学楼层(i/5)%3
。当您除以负数时,这将给出错误的结果。

您可以使用三种不同的数学API

Math.floor始终为您提供最低的数字:

Math.floor( 1 / 5 ) // 0
Math.floor( 4 / 5 ) // 0
Math.ceil( 1 / 5 ) // 1
Math.ceil( 4 / 5 ) // 1
Math.ceil始终为您提供最高数字:

Math.floor( 1 / 5 ) // 0
Math.floor( 4 / 5 ) // 0
Math.ceil( 1 / 5 ) // 1
Math.ceil( 4 / 5 ) // 1
Math.round为您提供最接近的选项:

Math.round( 1 / 5 ) // 0
Math.round( 4 / 5 ) // 1

您可以使用三种不同的数学API

Math.floor始终为您提供最低的数字:

Math.floor( 1 / 5 ) // 0
Math.floor( 4 / 5 ) // 0
Math.ceil( 1 / 5 ) // 1
Math.ceil( 4 / 5 ) // 1
Math.ceil始终为您提供最高数字:

Math.floor( 1 / 5 ) // 0
Math.floor( 4 / 5 ) // 0
Math.ceil( 1 / 5 ) // 1
Math.ceil( 4 / 5 ) // 1
Math.round为您提供最接近的选项:

Math.round( 1 / 5 ) // 0
Math.round( 4 / 5 ) // 1

不确定这是否是你想要的。您可以尝试使用:


但看起来上面的内容是四舍五入的。

不确定这是否是您想要的。您可以尝试使用:


但是上面的问题似乎是四舍五入。

这个问题与TypeScript无关。TypeScript不提供新的运算符、函数或截断数字的方法。TypeScript只是JavaScript之上的一个类型层


这是一个角度问题。不能在模板中使用
数学
(任何其他全局变量)。你的选择是:

  • (~(i/5))%3
  • (i/5-(i/5)%1)%3
  • 在TypeScript文件中计算它

    • 这个问题与TypeScript无关。TypeScript不提供新的运算符、函数或截断数字的方法。TypeScript只是JavaScript之上的一个类型层


      这是一个角度问题。不能在模板中使用
      数学
      (任何其他全局变量)。你的选择是:

      • (~(i/5))%3
      • (i/5-(i/5)%1)%3
      • 在TypeScript文件中计算它

        • 编写了用于截断的自定义管道

          import { Pipe, PipeTransform } from '@angular/core';
          import { DecimalPipe } from '@angular/common'
          
          @Pipe({
              name: 'truncateNum'
          })
          export class TruncateNumberPipe extends DecimalPipe implements PipeTransform {
              transform(value: any, digitsInfo?: string): string | null {
          
                  const NUMBER_FORMAT_REGEXP = /^(\d+)?\.((\d+)(-(\d+))?)?$/;
                  const parts = digitsInfo.match(NUMBER_FORMAT_REGEXP);
          
                  let maxFraction;
          
                  if (parts === null) {
                      throw new Error(`${digitsInfo} is not a valid digit info for number pipes`);
                  }
          
                  if (parts[5] != null) {  // max fraction digits
                      maxFraction = parseIntAuto(parts[5]);
                  }
          
                  return maxFraction ? super.transform(truncateToDecimals(strToNumber(value), maxFraction), digitsInfo) : super.transform(value, digitsInfo);
              }
          
          }
          
          function parseIntAuto(text: string): number {
              const result: number = parseInt(text);
              if (isNaN(result)) {
                  throw new Error('Invalid integer literal when parsing ' + text);
              }
              return result;
          }
          
          /**
          * truncate to decimal place.
          */
          function truncateToDecimals(num, dec) {
              const calcDec = Math.pow(10, dec);
              return Math.trunc(num * calcDec) / calcDec;
          }
          /**
          * Transforms a string into a number (if needed).
          */
          function strToNumber(value: number | string): number {
              // Convert strings to numbers
              if (typeof value === 'string' && !isNaN(Number(value) - parseFloat(value))) {
                  return Number(value);
              }
              if (typeof value !== 'number') {
                  throw new Error(`${value} is not a number`);
              }
              return value;
          }
          

          编写了用于截断的自定义管道

          import { Pipe, PipeTransform } from '@angular/core';
          import { DecimalPipe } from '@angular/common'
          
          @Pipe({
              name: 'truncateNum'
          })
          export class TruncateNumberPipe extends DecimalPipe implements PipeTransform {
              transform(value: any, digitsInfo?: string): string | null {
          
                  const NUMBER_FORMAT_REGEXP = /^(\d+)?\.((\d+)(-(\d+))?)?$/;
                  const parts = digitsInfo.match(NUMBER_FORMAT_REGEXP);
          
                  let maxFraction;
          
                  if (parts === null) {
                      throw new Error(`${digitsInfo} is not a valid digit info for number pipes`);
                  }
          
                  if (parts[5] != null) {  // max fraction digits
                      maxFraction = parseIntAuto(parts[5]);
                  }
          
                  return maxFraction ? super.transform(truncateToDecimals(strToNumber(value), maxFraction), digitsInfo) : super.transform(value, digitsInfo);
              }
          
          }
          
          function parseIntAuto(text: string): number {
              const result: number = parseInt(text);
              if (isNaN(result)) {
                  throw new Error('Invalid integer literal when parsing ' + text);
              }
              return result;
          }
          
          /**
          * truncate to decimal place.
          */
          function truncateToDecimals(num, dec) {
              const calcDec = Math.pow(10, dec);
              return Math.trunc(num * calcDec) / calcDec;
          }
          /**
          * Transforms a string into a number (if needed).
          */
          function strToNumber(value: number | string): number {
              // Convert strings to numbers
              if (typeof value === 'string' && !isNaN(Number(value) - parseFloat(value))) {
                  return Number(value);
              }
              if (typeof value !== 'number') {
                  throw new Error(`${value} is not a number`);
              }
              return value;
          }
          
          你可以用

          你可以用



          但是你不能在模板中使用
          Math
          。但是你不能在模板中使用
          Math
          。这个问题与TypeScript无关。这与角度模板有关。你应该修改标题。无论如何,您不能在模板内使用
          数学
          (或任何其他全局)。在这种情况下,您可以使用
          (~(i/5))%3
          。或者在您的TypeScript文件中计算它。或者使用
          (i-i%1)%3
          。最好在组件中执行逻辑,并在模板中显示结果。i、 例如,定义一个方法或变量来进行计算并显示结果。这样,您也可以访问Math.*方法。这个问题与TypeScript无关。这与角度模板有关。你应该修改标题。无论如何,您不能在模板内使用
          数学
          (或任何其他全局)。在这种情况下,您可以使用
          (~(i/5))%3
          。或者在您的TypeScript文件中计算它。或者使用
          (i-i%1)%3
          。最好在组件中执行逻辑,并在模板中显示结果。i、 例如,定义一个方法或变量来进行计算并显示结果。这样,您也可以访问Math.*方法。您不能在模板内使用
          Math
          。您不能在模板内使用
          Math
          。这些选项对我都不起作用。我在第一个上得到了一个意外的标记,第二个得到了我在第一个位置上的错误。我会选择第三个,但主要的问题是如何在模板上实现它。谢谢你的时间,你对数学的看法是对的。这些选项对我都不起作用。我在第一个上得到了一个意外的标记,第二个得到了我在第一个位置上的错误。我会选择第三个,但主要的问题是如何在模板上实现它。感谢您抽出时间,您对
          数学的看法是正确的。本网站通常不赞成只使用代码的答案。请编辑您的答案,包括一些注释或对代码的解释,好吗?解释应该回答这样的问题:它做什么?它是如何做到的?它去哪里了?它是如何解决OP的问题的?在这个网站上,只有代码的答案通常是不受欢迎的。请编辑您的答案,包括一些注释或对代码的解释,好吗?解释应该回答这样的问题:它做什么?它是如何做到的?它去哪里了?它如何解决OP的问题?中不支持Math.trunctypescript@DavedeJong错,Math.trunc是ES2015的一部分,因此可以与Typescript一起使用。那时候我在ES5工作,它工作得很好。不支持Math.trunc ES5。中不支持Math.trunctypescript@DavedeJong错,Math.trunc是ES2015的一部分,因此可以与Typescript一起使用。那时候我在ES5工作,它工作得很好。ES5不支持Math.trunc。