19

JavaScript ではなく C# でこの質問に似ています。検索中にC#のものが見つかりませんでした

数量を受け取るテキスト ボックスがあり、後で double としてデータベースに格納されます。ただし、0.5 の場合は 1/2 など、一部の数量を文字列の分数として入力することもできます。これらをデータベースに保存する前に、これらを 10 進数に変換できるようにしたいと考えています (逆に変換できると便利ですが、必須ではありません)。分数と帯分数の両方を処理できるようにしたい (例: 2 1/2 は 2.5 として保存される)

誰でもこれを行う方法を知っていますか?

4

5 に答える 5

15

次のように、スペースとスラッシュで分割してみてください。

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

ねえ、それはうまくいきました!ゼロ除算も忘れずにチェックしてください。結果として、Infinity、-Infinity、または NaN が得られます。

于 2012-12-16T17:23:54.763 に答える
9

そして、ここにもう1つの解決策がありますが、もう少しシームレスな統合があります:

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。可能な入力の長いリストに入ることなく、これはいくつかの基本で機能しました。ニーズに合わせてクラスを自由に微調整してください。

于 2012-12-16T17:58:48.790 に答える
1

「/」で文字列を分割し、2 つの数値を分割します。

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();
}
于 2012-12-16T17:19:26.020 に答える
1

次のようなものを試すことができます: http://csharpeval.codeplex.com/またはこれ: https://github.com/Giorgi/Math-Expression-Evaluator

どちらのライブラリも、C# で記述された完全な数式エバリュエーターです。それらはおそらくあなたのユースケースではやり過ぎですが、他の人の利益のために言及する価値があります.

于 2013-12-03T05:45:37.787 に答える
-2
decimal re = (decimal)1/7;

私のために働きます。

于 2014-12-30T18:49:27.393 に答える