将文本分数转换为小数

J.B*_*J.B 17 c#

与C#中的这个问题类似,而不是JavaScript.搜索时我找不到C#的任何内容

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

有人知道这样做的方法吗?

Ry-*_*Ry- 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.");
}
Run Code Online (Sandbox Code Playgroud)

嘿,它有效!记得也要检查零除.结果你会获得Infinity,-Infinity或NaN.

  • 非常感谢!刚刚在我的应用程序中实现了它,它运行良好。 (2认同)

Bra*_*tie 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

并且因为它实现了隐式运算符,所以它可以简单地用于:

Double number = new FractionalNumber("3 1/2");
Run Code Online (Sandbox Code Playgroud)

任何无法解析的东西都会返回Double常量Double.NaN.如果没有获得可能的输入清单,这可以解决一些基本问题.随意调整课程以满足您的需求.