Convert decimal amount to text string fraction in Javascript?

雨燕双飞 提交于 2019-12-22 08:57:22

问题


I have a value returned as a number, with could be decimal number e.g. "1.15".

However, I need to format all numbers in a range to a given fraction. For example, all numbers greater than 0 but less than .2 I want to return "1/8".

I already started to do this as a series of if/else statements, but I was wondering if there was a smarter and neater way.

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.....

回答1:


Move your code into a function, and you can return from the correct branch and skip all the else statements, which cleans things up pretty dramatically:

function toFraction(amt) {
  if (amt > 0 && amt <= .2) return '1/8';
  if (amt <= .3) return '1/4';
  if (amt <= .4) return '1/3';
  if (amt <= .5) return '1/2';
  // etc
}



回答2:


Ratio.js has a function called .toQuantityOf().

.toQuantityOf() returns a new fraction after converting the current value of the fraction to it's approximate value based on the provided units. If multiple units are passed as arguments, then the closest match to the original value will be returned.

.toString() returns the fraction as a string.

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

.toLocaleString() will return mixed numbers if needed.

fraction.toLocaleString() == "1 1/8";



回答3:


You can perform mathematical operations on amt to transform it to an integer value within a range, then use that as an index for an array lookup to get the fraction text.

That can be simple if your ranges are equal, but since you have some 1/10th (0.3 to 0.4) and some 2/10ths (0.5 to 0.7) it's a little more complex, more than just multiply by 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));



回答4:


  1. Multiple amt by 10 and get the integer part
  2. From an array that you have previous constructed - look up the corresponding string!

NB - That array is fixed - so is static



来源:https://stackoverflow.com/questions/7249195/convert-decimal-amount-to-text-string-fraction-in-javascript

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!