Currency Formatting MVC
Asked Answered
G

1

38

I'm trying to format an Html.EditorFor textbox to have currency formatting, I am trying to base it off of this thread String.Format for currency on a TextBoxFor. However, my text just still shows up as 0.00 with no currency formatting.

<div class="editor-field">
        @Html.EditorFor(model => model.Project.GoalAmount, new { @class = "editor-     field", Value = String.Format("{0:C}", Model.Project.GoalAmount) })

There is the code for what I am doing, and here is the html for that field in the website itself contained within the editor-field div of course.

<input class="text-box single-line valid" data-val="true" 
 data-val-number="The field Goal Amount must be a number." 
 data-val-required="The Goal Amount field is required."
 id="Project_GoalAmount" name="Project.GoalAmount" type="text" value="0.00">

Any help would be appreciated, thanks!

Gilboa answered 24/5, 2012 at 16:5 Comment(0)
C
75

You could decorate your GoalAmount view model property with the [DisplayFormat] attribute:

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:c}")]
public decimal GoalAmount { get; set; }

and in the view simply:

@Html.EditorFor(model => model.Project.GoalAmount)

The second argument of the EditorFor helper doesn't do at all what you think it does. It allows you to pass additional ViewData to the editor template, it's not htmlAttributes.

Another possibility is to write a custom editor template for currency (~/Views/Shared/EditorTemplates/Currency.cshtml):

@Html.TextBox(
    "", 
    string.Format("{0:c}", ViewData.Model),
    new { @class = "text-box single-line" }
)

and then:

@Html.EditorFor(model => model.Project.GoalAmount, "Currency")

or use [UIHint]:

[UIHint("Currency")]
public decimal GoalAmount { get; set; }

and then:

@Html.EditorFor(model => model.Project.GoalAmount)
Counterclaim answered 24/5, 2012 at 16:8 Comment(7)
What is the format string for Currency (pounds) without pence? I cant seem to find it as of yet. Thanks.Deas
I had to cast your ViewData.Model to decimal after converting or parsing it to one for the TextBox to satisfy the correct overload. string.Format("{0:c}", (decimal)decimal.Parse(Model))) )Castaneda
How do you get around the problem that a formatted currency field causes with the model binding when the form is posted? Since there are invalid characters for a decimal in the form field, the binding doesn't fill the value when the form is posted. Seems heavy handed to have to create a custom binder for this scenario...Curfew
Seems heavy handed to have to create a custom binder for this scenario - That's precisely what I would do if I had to support this scenario. But I would write it in such a way so that it uses the DisplayFormat attribute with which was decorated the view model property and reuse the same format for displaying and binding.Counterclaim
This helped me but I set ApplyFormatInEditMode = true to ApplyFormatInEditMode = false - This stops the validation message of input must be a number, when currency symbol is present in edit text box. - I think the user should know what currency he is working with - any way if its multiple currency management, the currency symbol should be stored with the value, otherwise how would one know if the amount is in Pounds, Dollars or Euros if looking at the database.Trencher
Glad to see this question has helped out quite a few people!Gilboa
I needed to add @model IFormattable at the beginning. Also these days we can write typesafe [DataType(DataType.Currency)] instead of UIHintHagioscope

© 2022 - 2024 — McMap. All rights reserved.