C# C语言中分数简化为普通分数码#

C# C语言中分数简化为普通分数码#,c#,C#,我有一个特殊的例子,在可能的情况下,我需要返回“粗俗”分数。我提出的代码如下 var complexFractionString = heaveValue.ToComplexFractionString(); complexFractionString = complexFractionString.Replace("1/8", "⅛"); complexFractionString = complexFractionString.Replace("1/4", "¼"); complexFrac

我有一个特殊的例子,在可能的情况下,我需要返回“粗俗”分数。我提出的代码如下

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()是一种以字符串格式返回double的最小公分母分数的方法。i、 e.5的输入将返回“1/2”

这段代码现在适用于我的用例,但我一点也不喜欢它的结构。这是非常脆弱的,因为“1/16”或“1/32”的一小部分将在不被更改的情况下通过,而且代码是一堆行来完成一些相对容易的事情

在C#中有更好的方法吗

卢克,使用原力(不可变结构)

公共结构分数
{
只读整型分子、分母;
公共分数(双x)
{
//构造一个分数
}
公共分数(整数分子、整数分母)
{
这个。分子=分子;
这个。分母=分母;
}
公共分数缩减(){/*简化*/}
公共重写字符串ToString()
{
返回分数(分子、分母);
}
静态字符串分数(整数分子、整数分母)
{
if(数字命名器)
{
//将7/4处理为“1¾”
返回string.Format(“{0}{1}”,
分子/分母,
分数(分子%分母,分母);
}
//句柄0/1=“0”
如果(分子==0)返回“0”;
//句柄10/1=“10”
if(分母==1)返回分子.ToString();
//手柄1/2=½
如果(分母==2)
{
如果(分子==1)返回“½”;
}
//手柄1/4=¼
如果(分母==4)
{
如果(分子==1)返回“¼”;
如果(分子==3)返回“¾”;
}
//句柄1/8=⅛
如果(分母==8)
{
如果(分子==1)返回“⅛";
如果(分子==3)返回“⅜";
如果(分子==5)返回“⅝";
如果(分子==7)返回“⅞";
}
//一网打尽
返回string.Format(“{0}/{1}”,分子,分母);
}
}

为什么要用字符串进行数学运算?使用
结构分数{}
并在
ToString()中编写代码
基于值,而不是它们的字符串表示形式。我没有用字符串进行任何计算…我用双精度进行了计算,并以分数形式将数字报告回我的GUI。不幸的是,我的一些控件不喜欢显示“/”,所以我使用“粗俗”分数来解决这个问题。如果你有
71/80
,怎么办这种显示可以显示½而不是1/2?WPF数据网格在标题中显示“.”和“/”。也就是说,如果您尝试,标题将显示,但该列中的值将不会显示。请确保您使用复数分数表示法处理
分子>分母的情况。我不确定这对我当前的代码有什么影响。这不是问题更灵活,更长,并且不处理大于1的复杂分数。现在它可以处理,并且在代码中显示为
½0
时不会失败(您最初的问题)。现在唯一需要处理的事情是
denominor你在我发表评论的同时发布了修订版。你对1/20的观察是正确的。我想我希望有比这更直接的东西。
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);
    }
}