简化分数到普通分数的c#代码

本文关键字:代码 | 更新日期: 2023-09-27 18:15:30

我有一个特殊的情况,我需要在任何可能的地方返回'庸俗'分数。我编写的代码如下

var complexFractionString = heaveValue.ToComplexFractionString();
complexFractionString = complexFractionString.Replace("1/8", "⅛");
complexFractionString = complexFractionString.Replace("1/4", "¼");
complexFractionString = complexFractionString.Replace("3/8", "⅜");
complexFractionString = complexFractionString.Replace("1/2", "½");
complexFractionString = complexFractionString.Replace("5/8", "⅝");
complexFractionString = complexFractionString.Replace("3/4", "¾");
complexFractionString = complexFractionString.Replace("7/8", "⅞");
return complexFractionString;

. tocomplexfractionstring()是一个以字符串格式返回双精度数的最小公分母分数的方法。例如,输入0.5将返回"1/2"

这段代码现在适用于我的用例,但我根本不喜欢它的结构。它是非常脆弱的,因为"1/16"或"1/32"的一小部分可以在不改变的情况下通过,如果代码是一堆行,做一些应该相对容易的事情。

在c#中是否有更好的方法来做到这一点?

简化分数到普通分数的c#代码

Luke,使用force(不可变结构)

public struct Fraction
{
    readonly int numerator, denominator;
    public Fraction(double x)
    {
        // construct a fraction
    }
    public Fraction(int numerator, int denominator)
    {
        this.numerator=numerator;
        this.denominator=denominator;
    }
    public Fraction Reduced() { /* Simplify */ }
    public override string ToString()
    {
        return GetVulgarFraction(numerator, denominator);
    }
    static string GetVulgarFraction(int numerator, int denominator)
    {
        if(numerator<0)
        {
            // Handle -1/2 as "-½"
            return string.Format("-{0}", 
                GetVulgarFraction(-numerator, denominator));
        }
        if(numerator>denominator)
        {
            // Handle 7/4 as "1 ¾"
            return string.Format("{0} {1}", 
                numerator/denominator, 
                GetVulgarFraction(numerator%denominator, denominator));
        }
        // Handle 0/1 = "0"
        if(numerator==0) return "0";
        // Handle 10/1 = "10"
        if(denominator==1) return numerator.ToString();
        // Handle 1/2 = ½
        if(denominator==2)
        {
            if(numerator==1) return "½";
        }
        // Handle 1/4 = ¼
        if(denominator==4)
        {
            if(numerator==1) return "¼";
            if(numerator==3) return "¾";
        }
        // Handle 1/8 = ⅛
        if(denominator==8)
        {
            if(numerator==1) return "⅛";
            if(numerator==3) return "⅜";
            if(numerator==5) return "⅝";
            if(numerator==7) return "⅞";
        }
        // Catch all
        return string.Format("{0}/{1}", numerator, denominator);
    }
}