Хотя вы можете сделать это с помощью внешних библиотек, это более чем возможно с помощью машинописи, с помощью евклидового алгоритма вы можете вычислить наибольший общий делитель между двумя числами и поделить на десятичное значение, где это десятичное значениевычисляется как
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;
}
}