简化分数到普通分数的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#中是否有更好的方法来做到这一点?
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);
}
}