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

Я пытаюсь создать функцию javascript, которая может принимать входную строку дроби, такую ​​как '3/2', и преобразовывать ее в десятичную - в виде строки '1.5' или числа 1.5

function ratio(fraction) {
    var fraction = (fraction !== undefined) ? fraction : '1/1',
    decimal = ??????????;
    return decimal;
});

Есть ли способ сделать это?

Ответы [ 14 ]

41 голосов
/ 22 августа 2011

Поскольку никто еще не упомянул об этом, существует быстрое и грязное решение:

var decimal = eval(fraction); 

, которое обладает способностью правильно оценивать все виды математических строк.

eval("3/2")    // 1.5
eval("6")      // 6
eval("6.5/.5") // 13, works with decimals (floats)
eval("12 + 3") // 15, you can add subtract and multiply too

Люди здесь будут быстро упоминать об опасностях использования необработанного eval, но я представляю это как ответ ленивого человека.

15 голосов
/ 22 августа 2011

Вот минимальный код, необходимый для этого:

var a = "3/2";
var split = a.split('/');
var result = parseInt(split[0], 10) / parseInt(split[1], 10);
alert(result); // alerts 1.5

JsFiddle: http://jsfiddle.net/XS4VE/

Что нужно учитывать:

  • деление на ноль
  • если пользователь дает целое число вместо дроби или любой другой неверный ввод
  • вопросы округления (например, 1/3)
6 голосов
/ 22 августа 2011

Примерно так:

bits = fraction.split("/");
return parseInt(bits[0],10)/parseInt(bits[1],10);
5 голосов
/ 14 октября 2013

Я создал хорошую функцию, чтобы сделать это, все было основано на этом вопросе и ответах, но он будет принимать строку и выводить десятичное значение, но также будет выводить целые числа без ошибок

https://gist.github.com/drifterz28/6971440

function toDeci(fraction) {
    fraction = fraction.toString();
    var result,wholeNum=0, frac, deci=0;
    if(fraction.search('/') >=0){
        if(fraction.search('-') >=0){
            wholeNum = fraction.split('-');
            frac = wholeNum[1];
            wholeNum = parseInt(wholeNum,10);
        }else{
            frac = fraction;
        }
        if(fraction.search('/') >=0){
            frac =  frac.split('/');
            deci = parseInt(frac[0], 10) / parseInt(frac[1], 10);
        }
        result = wholeNum+deci;
    }else{
        result = fraction
    }
    return result;
}

/* Testing values / examples */
console.log('1 ',toDeci("1-7/16"));
console.log('2 ',toDeci("5/8"));
console.log('3 ',toDeci("3-3/16"));
console.log('4 ',toDeci("12"));
console.log('5 ',toDeci("12.2"));
2 голосов
/ 20 марта 2015

У меня есть функция, которую я использую для обработки целых чисел, смешанных дробей (включая символы вульгарной дроби Юникода) и десятичных дробей. Вероятно, нуждается в некоторой полировке, но это работает для моей цели (синтаксический анализ списка ингредиентов).

Входы "2 1/2", "2½", "2 ½" и "2.5" все вернут 2.5. Примеры:

var numQty = require("numeric-quantity");

numQty("1 1/4") === 1.25;  // true
numQty("3 / 4") === 0.75;  // true
numQty("¼" ) === 0.25;     // true
numQty("2½") === 2.5;      // true
numQty("¾") === 0.75;      // true
numQty("⅓") === 0.333;     // true
numQty("⅔") === 0.667;     // true

Одна вещь, которую он не обрабатывает, это десятичные дроби внутри дроби, например, "2.5 / 5".

1 голос
/ 30 января 2018

Если вы не возражаете против использования внешней библиотеки, math.js предлагает некоторые полезные функции для преобразования дробей в десятичные числа, а также выполнения арифметики дробных чисел.

console.log(math.number(math.fraction("1/3"))); //returns 0.3333333333333333
console.log(math.fraction("1/3") * 9) //returns 3
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/3.20.1/math.js"></script>
1 голос
/ 21 ноября 2017

Слишком поздно, но может быть полезно:

Вы можете использовать Array.prototype.reduce вместо eval https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

ES6

const fractionStrToDecimal = str => str.split('/').reduce((p, c) => p / c);
console.log(fractionStrToDecimal('1/4/2')); // Logs 0.125
console.log(fractionStrToDecimal('3/2')); // Logs 1.5

CJS

function fractionStrToDecimal(str) {
  return str.split('/').reduce((p, c) => p / c);
}
console.log(fractionStrToDecimal('1/4')); // Logs 0.25

[EDIT] Удалено начальное значение редуктора, и теперь функция работает для числителей больше 1. Спасибо, Джеймс Фьюри.

0 голосов
/ 02 июля 2019

Это тоже будет работать:

let y = "2.9/59"
let a = y.split('')
let b = a.splice(a.indexOf("/"))
console.log(parseFloat(a.join('')))
a = parseFloat(a.join(''))
console.log(b)
let c = parseFloat(b.slice(1).join(''))
let d = a/c
console.log(d) // Answer for y fraction
0 голосов
/ 03 марта 2019

безопаснее Eval () в соответствии с MDN

const safeEval = (str) => {
   return Function('"use strict";return (' + str + ")")();
}

safeEval("1 1/2") // 1.5

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval#Do_not_ever_use_eval!

0 голосов
/ 26 июля 2018

Также немного опоздал на вечеринку, но альтернативой eval() с меньшими проблемами безопасности (по крайней мере, согласно MDN) является фабрика Function().

var fraction = "3/2";
console.log( Function("return (" + fraction + ");")() );

Это вывело бы результат "1.5" в консоль.

Также в качестве примечания: Смешанные дроби, такие как 1 1/2, не будут работать ни с eval(), ни с решением с Function(), как написано, поскольку они оба натыкаются на пространство.

...