HiveBrain v1.2.0
Get Started
← Back to all entries
patternjavascriptModerate

Pretty printing degrees input to radians

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
prettydegreesinputprintingradians

Problem

I'm mostly concerned about edge cases, although I think I dealt with them all. Improvements on code quality would also be much appreciated.

/*
    printRadian(90) -> π/2
    printRadian(-90) -> -π/2
    printRadian(180) -> π
    printRadian(-180) -> -π
    printRadian(270) -> 3π/2
*/

function printRadian(degrees) {

    if(degrees % 180 == 0) {
        if(degrees == 180) {
            return "π";
        }
        else if(degrees == -180){
            return "-π";
        }else{
            return degrees / 180 + "π";
        }
    }

    var frac = degrees / 180;

    // 10 ** number of decimal places 
    var multiplier = Math.pow(10, frac.toString().split(".")[1].length);
    var numerator = frac * multiplier;
    var denominator = multiplier;

    //http://stackoverflow.com/a/17445304/896112 - Euclid's Algorithm
    function gcd(a, b) {
        return (!b)?a:gcd(b, a%b);
    }

    var g = gcd(numerator, denominator);

    numerator = numerator/g;
    denominator = denominator/g;

    if(numerator == 1){
        numerator = "π";
    }else if(numerator == -1){
        numerator = "-π";
    }else{
        numerator += "π"
    }

    if(denominator < 0){
        denominator = Math.abs(denominator);
        numerator = "-"+numerator;
    }

    return numerator +"/"+ denominator; 
}

Solution

Your code looks more complicated than necessary and some of your special cases are really not needed.

I will use an incremental development to avoid unnecessary code:

The first version is just based on the formula, with no additional prettiness:



function printRadians(angle) {
return angle + "π" + "/" + 180;
}

document.write([45, 90, 180, 270, 360, -45, -18].map(printRadians).join(' '));




Then we want to simplify the fraction, using, as you did, the gcd function:



function gcd(a, b) {
return (b == 0)?a:gcd(b, a%b);
}

function printRadians(angle) {
var _gcd = gcd(angle, 180)
return angle / _gcd + "π" + "/" + 180 / _gcd;
}

document.write([45, 90, 180, 270, 360, -45, -18].map(printRadians).join(' '));




We are getting nearer, now we should take care of removing unnecessary ones:



function gcd(a, b) {
return (b == 0)?a:gcd(b, a%b);
}

function printRadians(angle) {
var _gcd = gcd(angle, 180)
var numerator = angle / _gcd == 1 ? "" : angle / _gcd;
var denominator = 180 / _gcd == 1 ? "" : "/" + (180 / _gcd);
return numerator + "π" + denominator;
}

document.write([45, 90, 180, 270, 360, -45, -18].map(printRadians).join(' '));




And now let's put the minus in front of the numerator, not denominator:



function gcd(a, b) {
return (b == 0)?a:gcd(b, a%b);
}

function printRadians(angle) {
var _gcd = gcd(angle, 180);
var numerator = angle / _gcd == 1 ? "" : angle / _gcd;
var denominator = 180 / _gcd == 1 ? "" : "/" + Math.abs(180 / _gcd);
return ((angle



And we are done, just \$4\$ lines, with no lengthy
if`s for special cases.

Context

StackExchange Code Review Q#116308, answer score: 13

Revisions (0)

No revisions yet.