将文本分数转换为小数

时间:2012-12-16 17:17:15

标签: c#

与C#中的this question类似,而非JavaScript。搜索时我找不到C#的任何内容

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

有人知道这样做吗?

5 个答案:

答案 0 :(得分:12)

尝试将其拆分为空格和斜杠,例如:

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.");
}

Hey, it worked!请记住检查除以零。结果你会得到Infinity,-Infinity或NaN。

答案 1 :(得分:9)

这还有一个解决方案,但还有一点seamless an integration

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。如果没有获得可能的输入清单,这可以解决一些基本问题。随意调整课程以满足您的需求。

答案 2 :(得分: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();
}

答案 3 :(得分:1)

你可以尝试这样的事情:http://csharpeval.codeplex.com/或者这样:https://github.com/Giorgi/Math-Expression-Evaluator

这两个库都是用C#编写的完整数学表达式计算器。它们可能对你的用例有些过分,但值得一提的是为了别人的利益。

答案 4 :(得分:-2)

decimal re = (decimal)1/7;

适合我。

相关问题