将文本分数转换为小数

22

这个问题类似,只不过是用C#代替JavaScript。我在搜索时找不到任何有关C#的内容。

我有一个文本框,可以输入数量,稍后将其作为double存储在数据库中。但是,有可能会将一些数量输入为字符串分数,例如1/2表示0.5。 我希望能够在将它们存储到数据库之前将其转换为十进制数(能够进行转换回来也很好,但不是必要的)。我希望能够处理分数和混合数字,例如2 1/2被保存为2.5。

有人知道如何做到这一点吗?


我会将其拆分为一个解析库,该库查找常见的元素,如空格、/等,并使用Int32.Parse返回结果。 - Brad Christie
http://www.codeproject.com/Articles/9078/Fraction-class-in-C - Chris Sinclair
5个回答

21

尝试通过空格和斜杠进行拆分,类似于:

double FractionToDouble(string fraction) {
    double result;

    if(double.TryParse(fraction, out result)) {
        return result;
    }

    string[] split = fraction.Split(new char[] { ' ', '/' });

    if(split.Length == 2 || split.Length == 3) {
        int a, b;

        if(int.TryParse(split[0], out a) && int.TryParse(split[1], out b)) {
            if(split.Length == 2) {
                return (double)a / b;
            }

            int c;

            if(int.TryParse(split[2], out c)) {
                return a + (double)b / c;
            }
        }
    }

    throw new FormatException("Not a valid fraction.");
}

嘿,它起作用了! 还要注意检查是否存在除以零的情况。你会得到无穷大、负无穷大或NaN作为结果。


2
非常感谢!我刚刚将它实现到我的应用程序中,它完美地运行了。 - J.B
为什么我们需要使用分隔符“ ”(空格)?@U2744 SNOWFLAKE - Don Larynx
还有,仅使用以下代码行是否可行?它可以正确输出。double frac = (double)1/8; - Don Larynx
@DonLarynx:这是一个用于解析字符串(例如用户输入)的函数。您不会将其用作程序中的常量表达式。空格分隔符用于混合分数,例如 1 1/2 - Ry-

9

这里是另一种解决方案,但集成得更加无缝

public class FractionalNumber
{
    public Double Result
    {
        get { return this.result; }
        private set { this.result = value; }
    }
    private Double result;

    public FractionalNumber(String input)
    {
        this.Result = this.Parse(input);
    }

    private Double Parse(String input)
    {
        input = (input ?? String.Empty).Trim();
        if (String.IsNullOrEmpty(input))
        {
            throw new ArgumentNullException("input");
        }

        // standard decimal number (e.g. 1.125)
        if (input.IndexOf('.') != -1 || (input.IndexOf(' ') == -1 && input.IndexOf('/') == -1 && input.IndexOf('\\') == -1))
        {
            Double result;
            if (Double.TryParse(input, out result))
            {
                return result;
            }
        }

        String[] parts = input.Split(new[] { ' ', '/', '\\' }, StringSplitOptions.RemoveEmptyEntries);

        // stand-off fractional (e.g. 7/8)
        if (input.IndexOf(' ') == -1 && parts.Length == 2)
        {
            Double num, den;
            if (Double.TryParse(parts[0], out num) && Double.TryParse(parts[1], out den))
            {
                return num / den;
            }
        }

        // Number and fraction (e.g. 2 1/2)
        if (parts.Length == 3)
        {
            Double whole, num, den;
            if (Double.TryParse(parts[0], out whole) && Double.TryParse(parts[1], out num) && Double.TryParse(parts[2], out den))
            {
                return whole + (num / den);
            }
        }

        // Bogus / unable to parse
        return Double.NaN;
    }

    public override string ToString()
    {
        return this.Result.ToString();
    }

    public static implicit operator Double(FractionalNumber number)
    {
        return number.Result;
    }
}

由于它实现了隐式操作符,因此可以简单地使用:

Double number = new FractionalNumber("3 1/2");

无法解析的任何内容都会返回Double常量Double.NaN。不想列出可能的输入列表,这些基础知识已经足够了。可以随意调整类以适应您的需求。


1

1

将字符串按“/”分割,然后将两个数字相除。

public float FractionToDecimal(String input)
{
    String[] fraction = input.Split(new[] { "/" }, StringSplitOptions.RemoveEmptyEntries);
    if (fraction.Length != 2)
    {
        throw new ArgumentOutOfRangeException();
    }
    Int32 numerator, denominator;
    if (Int32.TryParse(fraction[0], out numerator) && Int32.TryParse(fraction[1], out denominator))
    {
        if (denominator == 0)
        {
            throw new InvalidOperationException("Divide by 0 occurred");
        }
        return (float)numerator / denominator;
    }
    throw new ArgumentException();
}

-2
decimal re = (decimal)1/7;

对我来说可行。


1
编译器可以这样做,因为它们是数字字面量,并且“/”形成数学表达式。 (decimal)"1/7"`将惨败。 - BradleyDotNET
没错。我刚才忽略了“text”在文本分数中的含义,我很抱歉。让另一个用户先运行函数“fractiontodouble”,但将其更改为“fractiontodecimal”。 - Don Larynx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接