Угловая труба, преобразующая число в читаемую дробь - PullRequest
3 голосов
/ 14 октября 2019

Я хотел бы создать канал Angular 5, который переводит более читаемую дробь из числа.

Например:

0,66 -> ⅔
0,25 -> ¼
1.25 -> 1 ¼

Вот то, что у меня уже есть, но я бы хотелхотел бы сделать его более динамичным:

export class FracturePipe implements PipeTransform {
  transform(value: any, args?: any): any {
    let roundedValue = Math.round(Number(value) * 100) / 100

    if (roundedValue === 0.66) {
      return '⅔'
    }
    //..and so on, but maybe there is a better way
  }
}

Есть идеи, как сделать это более пагубным способом?

Ответы [ 3 ]

1 голос
/ 14 октября 2019

Хотя вы можете сделать это с помощью внешних библиотек, это более чем возможно с помощью машинописи, с помощью евклидового алгоритма вы можете вычислить наибольший общий делитель между двумя числами и поделить на десятичное значение, где это десятичное значениевычисляется как

const wholeNumber = Math.floor(input);
const decimal = input - wholeNumber;

Возвращение этой трубы - сначала строка, за которой следует целочисленное значение числа, а затем вычисляемая дробь (десятичная дробь, деленная на gcd, и нижняя дробь, деленная на gcd) * 1006. *

Пример: 1.3 вернет 1 3/10 Затем вы можете отредактировать вывод канала по своему вкусу

 export class FracturePipe implements PipeTransform {
 transform(value: any, args?: any): any {

  if (value === parseInt(value)) {
        return value.toString();
      } else {
        let top = value.toString().includes('.') ? value.toString().replace(/\d+[.]/, '') : 0;
        const wholeNumber = Math.floor(value);
        const decimal = value - wholeNumber;
        const bottom = Math.pow(10, top.toString().replace('-', '').length);
        if (decimal >= 1) {
          top = +top + (Math.floor(decimal) * bottom);
        } else if (decimal <= -1) {
          top = +top + (Math.ceil(decimal) * bottom);
        }

        const x = Math.abs(this.gcd(top, bottom));
        if (wholeNumber === 0) {
          return (top / x) + '/' + (bottom / x);
        }
        return wholeNumber + ' ' + (top / x) + '/' + (bottom / x);
      }
}

gcd(a: number, b: number) {
    return (b) ? this.gcd(b, a % b) : a;
  }
}
0 голосов
/ 14 октября 2019

Эта библиотека может помочь, если вы передадите два значения вместо готового числа с плавающей запятой: https://github.com/ben-ng/vulgarities

var characterFor = require('vulgarities/charFor')
  , vulgarities = require('vulgarities');

console.log(characterFor(1,4)); // Returns "\u00BC"

Если вы объедините это с ответом EvaldasBuinauskas, вы получите что-то вроде этого:

export class FractionPipe implements PipeTransform {
    transform(value: number): string {
        const { numerator, denominator } = new Fraction(value);

        return characterFor(numerator, denominator);
    }
}
0 голосов
/ 14 октября 2019

Я думаю, вы могли бы использовать дробь , чтобы заставить его работать. Я не работал с этим, но на самом деле проблема заключается в преобразовании чисел. Так что, если вам удалось заставить этих двоих работать вместе, я думаю, что это может быть что-то вроде следующего:

export class FractionPipe implements PipeTransform {
    transform(value: number): string {
        const { numerator, denominator } = new Fraction(value);

        return `${numerator} and ${denominator} formatted`;
    }
}
...