Преобразовать десятичную сумму в текстовую строку в Javascript? - PullRequest
4 голосов
/ 31 августа 2011

У меня есть значение, возвращаемое в виде числа, с может быть десятичным числом, например "1,15".

Однако мне нужно отформатировать все числа в диапазоне до заданной доли. Например, все числа больше 0, но меньше .2 Я хочу вернуть «1/8».

Я уже начал делать это как серию операторов if / else, но мне было интересно, есть ли более умный и аккуратный способ.

if (amt > 0 && amt <= .2){
    q = '1/8';
} else if (amt > .2 && amt <= .3){
    q = '1/4';
}  else if (amt > .3 && amt <= .4){
    q = '1/3';
}  else if (amt > .4 && amt <= .5){
    q = '1/2';
} else if (amt > .5 && amt <= .7){
    q = '2/3';
} else if (amt > .7 && amt <= .8){
    q = '3/4';
} else if (amt > .8 && amt <= 1.0){
    q = '7/8';
} else if (amt > 1 && amt <= 1.1){
    q = '1';
} etc.....

Ответы [ 4 ]

3 голосов
/ 31 августа 2011

Переместите ваш код в функцию, и вы можете return из правильной ветви и пропустить все операторы else, что довольно драматично проясняет ситуацию:

2 голосов
/ 09 мая 2012

Ratio.js имеет функцию под названием .toQuantityOf().

.toQuantityOf() возвращает новую дробь после преобразования текущего значения дроби в ее приблизительное значение на основе предоставленных единиц. Если в качестве аргументов передается несколько единиц измерения, будет возвращено наиболее близкое совпадение с исходным значением.

.toString() возвращает дробь в виде строки.

var fraction = Ratio.parse("1.15").toQuantityOf(2,3,4,8);
fraction.toString() == "9/8";

.toLocaleString() при необходимости вернет смешанные числа.

fraction.toLocaleString() == "1 1/8";
1 голос
/ 31 августа 2011

Вы можете выполнить математические операции над amt, чтобы преобразовать его в целочисленное значение в диапазоне, а затем использовать его в качестве индекса для поиска в массиве, чтобы получить текст дроби.

Это может быть просто, есливаши диапазоны равны, но так как у вас есть примерно 1/10 (от 0,3 до 0,4) и около 2/10 (от 0,5 до 0,7), это немного сложнее, чем просто умножить на 10.


fractional = {
    fractions: [ "1/8", "1/8", "1/4", "1/3", "1/2", "2/3", "2/3", "3/4", "7/8", "1" ],
    toFraction: function(amt) {
        return this.fractions[(""+(amt*10)).split('.')[0]];
    }
};

alert(fractional.toFraction(0.37));
0 голосов
/ 31 августа 2011
  1. умножьте amt на 10 и получите целую часть
  2. Из созданного ранее массива - найдите соответствующую строку!

NB - этот массив является фиксированным - так же является статическим

...