0

MVC4、Code First、C# プロジェクト

money フィールドに明示的な値を入力するか、テーブルから読み込むと、TextBoxFor に小数点以下 2 桁の値が表示されます。フィールドが別のクラスの金額フィールドから取り込まれた場合、小数点以下 4 桁が表示されます。

  public class Class1
  {
    [Column(TypeName = "money")]
    public decimal Field1 { get; set; }
  }

  public class Class2
  {
    [Column(TypeName = "money")]
    public decimal Field1 { get; set; }
  }

  public class Table1
  {
    public int Id { get; set; } public decimal Value { get; set; }
  }

シナリオ 1:

Class1.Field1 = 14.95M;

シナリオ 2:

Class2.Field1 = Table1.Value;

シナリオ 3:

Class1.Field1 = Class2.Field1

意見

@Html.TextBoxFor(m => m.Class1.Field1, new { style = "width:70px;" })

シナリオ 1 と 2 では、TextBoxFor は小数点以下 2 桁を正しく表示し、シナリオ 3 では編集ボックスに小数点以下 4 桁を表示します。HTML属性を渡すことができるように、TextBoxForを使用する必要があります。

Class2 のインスタンス自体は、Class2 によって生成されたテーブルの値から事前設定されています。SSMS [テーブル内の該当するすべてのフィールドは (money, not null)] ですべてを調べましたが、デバッグで矛盾が見つかりませんでした。

シナリオ 3 の場合、TextBoxFor が誤って通貨の形式を表示するのはなぜですか (SQL は小数点以下 4 桁の精度で格納することを理解しています)。

さらに重要なのは、編集ボックスに常に小数点以下 2 桁で金額を表示するにはどうすればよいですか?

4

2 に答える 2

0

小数点以下 2 桁に丸めることができます (元の値は小数点以下 2 桁の精度であるため、丸め誤差については心配していません)。

decimal.Round(Value, 2)

Class1.Field1 = decimal.Round(Class2.Field1,2)

その後、拡張メソッドを使用して実装できます。

public static decimal dR2(this decimal ip) { return decimal.Round(ip, 2); }

Class1.Field1 = Class2.Field1.dR2();
于 2013-07-03T01:11:41.757 に答える
0

私の MVC アプリでは、テキスト ボックスを のように表示したいと考えていました$4.95。エディターテンプレートを使用しました。

@if(Model != null && Model.GetType() == typeof(string))
{
    @Html.TextBox(
    "",
    string.Format("{0:c}", (decimal)decimal.Parse(Model))
    )
}

@if(Model != null && Model.GetType() == typeof(decimal))
{
    @Html.TextBox(
        "",
       string.Format("{0:c}", (decimal) Model),new {@class="no-number-validation"}
         )
}

@if(Model == null)
{
    @Html.TextBox("",null,new {@class="no-number-validation"})
}

そして明らかに、サーバーに送り返し$4.95、Model Binder がそれを自動的に処理できるようにしたいと考えていました。この例では、% 記号も処理します。

public class DecimalModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext,
                            ModelBindingContext bindingContext)
    {
        ValueProviderResult valueResult = bindingContext.ValueProvider
            .GetValue(bindingContext.ModelName);
        ModelState modelState = new ModelState { Value = valueResult };
        object actualValue = null;
        try
        {
            if (valueResult.AttemptedValue.StartsWith("$"))
            {
                actualValue = decimal.Parse(valueResult.AttemptedValue, NumberStyles.Currency);
            }

            if (valueResult.AttemptedValue.EndsWith("%"))
            {
                actualValue = decimal.Parse(valueResult.AttemptedValue.Replace("%", "").Trim(),
                                            CultureInfo.CurrentCulture);
            }

            if (actualValue == null)
                actualValue = Convert.ToDecimal(valueResult.AttemptedValue,
                                                CultureInfo.CurrentCulture);
        }
        catch (FormatException e)
        {
            modelState.Errors.Add(e);
        }

        bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
        return actualValue;
    }
}

$ 記号を処理するために、通貨テキスト ボックスのプロパティ タイプとして文字列を使用する必要がないため、これは便利です。オブジェクトに値が設定されるまでに、通貨記号はなくなり、値は 10 進数型に正しく割り当てられます。

于 2013-07-02T23:56:18.387 に答える