2015-11-05 3 views
0

У меня есть следующий номер поплавка: -95,83334 это на мой взгляд, модель:Изменить номер формата отображения десятичного разделителя

[DisplayFormat(DataFormatString = "{0:#.##}")] 
public float? mx { get; set; } 

это на мой взгляд

@Html.HiddenFor(model => model.mx) 

это сгенерированный HTML

<input data-val="true" id="mx" name="mx" type="hidden" value="-95,83334"> 

и это желаемый HTML

<input data-val="true" id="mx" name="mx" type="hidden" value="-95.83334"> 

так что вопрос в том, что это лучший способ изменить разделитель десятичных знаков для этого скрытого ввода? без изменения остальная часть моего проекта

+0

Вы можете принудительно изменить тему 'CultureInfo.CurrentCulture' вашего потока, если вы хотите изменить глобально. – Dai

+0

Я предполагаю, что атрибут 'DisplayFormat' здесь не нужен и что он возится с вашим входным значением. – cleftheris

+0

Я стараюсь, что это хорошо работает, и мой CurrentCultur en-US –

ответ

2

DisplayFormat используется, когда вы используете Html.DisplayFor. И это только для форматирования того, что должно отображаться в представлении. Если вы хотите изменить формат десятичных чисел в целом, вам нужно будет использовать другую культуру.

+0

то как я могу изменить культуру только для этого скрытого? Мне нужно печатать запятые в некоторых случаях и указывать в других, в том же представлении – Clamari

+0

В чем смысл изменения культуры для скрытого ввода? Это не имеет никакого смысла. – ataravati

+0

, потому что моя культура приложения - es-CL, и мне нужно работать с десятичными запятыми, разделенными точкой, а не запятыми. я не могу выполнить математические операции с запятыми, децималами – Clamari

0
@Html.HiddenFor(model => model.mx.ToString(new CultureInfo("en-us"))); 

Редактировать: Извините за короткий ответ. Я думаю, что было бы полезно, если бы это сработало, к сожалению, я пропустил что-то важное в вашем коде.

Ваша проблема связана с локализацией. Я предполагаю, что ваша машина работает с европейской культурой. (Только что заметил ваш комментарий о том, что он установлен как испанский)

ToString() был перегружен для некоторых основных типов, включая float. Одна из этих перегрузок принимает IFormatProvider, который реализует CultureInfo. Передавая CultureInfo с помощью culture code для английского языка США, вы можете убедиться, что точка будет использоваться вместо запятой в качестве разделителя десятичной дроби.

Что я пропустил, так это то, что mx является поплавком ?, что является сокращением для Nullable. Nullable не перегружает ToString таким же образом, поэтому у вас есть несколько альтернатив.

Если вы используете C# 6, вы можете использовать оператор null check для преобразования вашего поплавка? вернуться к поплавке. Затем вы можете использовать перегрузку ToString:

@Html.HiddenFor(model => model.mx?.ToString(CultureInfo.GetCultureInfo("en-us"))); 

В качестве альтернативы, вы можете использовать перегрузку String.Format, которая принимает как строку формата и IFormatProvider:

@Html.HiddenFor(model => String.Format(CultureInfo.GetCultureInfo("en-us"), "{0:#.##}", model.mx)); 

Я не хотел бы предложить изменения культура вашей нити, потому что это выделялось в вашем вопросе «без изменения остальной части моего проекта», которую я, возможно, ошибочно предположил, означает, что вы не хотите изменять форматирование других компонентов в своем приложении. Изменение культуры потоков по умолчанию может оказать большее влияние, чем вы ожидаете.

Редактирование 2: Вот моя попытка перегрузки с расширением, принимающего IFormatProvider. Это был просто эксперимент и его нельзя использовать в производстве ... Я включаю его исключительно ради интереса.

public static class HtmlExtensions 
{ 
    public static IHtmlString HiddenFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, IFormatProvider formatter) 
    { 
     var value = expression.Compile().Invoke(helper.ViewData.Model); 

     var modelMetadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData); 
     var property = typeof(TModel).GetProperty(modelMetadata.PropertyName); 
     var attribute = property.GetCustomAttributes(typeof(DisplayFormatAttribute), false).SingleOrDefault() as DisplayFormatAttribute; 

     var displayValue = String.Format(formatter, attribute?.DataFormatString ?? "{0}", value); 

     TagBuilder tagBuilder = new TagBuilder("input"); 
     tagBuilder.MergeAttribute("type", "hidden"); 
     tagBuilder.MergeAttribute("value", displayValue); 

     return MvcHtmlString.Create(tagBuilder.ToString()); 
    } 
} 

Используйте его как этот

@Html.HiddenFor(mode => mode.myNumber, System.Globalization.CultureInfo.GetCultureInfo("en-us")) 
+0

нет переопределения для метода ToString, который принимает 1 параметр – Clamari

+0

Извинения, этот _was_ ответ, это было просто не очень хорошо. Я отредактировал, чтобы добавить соответствующий контекст. – eisenpony

+0

Я могу использовать 'CultureInfo.DefaultThreadCurrentCulture = new CultureInfo (« en-US »);' while я печатаю значения float, а затем использую 'CultureInfo.DefaultThreadCurrentCulture = new CultureInfo (« es-CL »);' вернуться к моему по умолчанию. однако сделать это в cshtml только вступят в силу в этом html и не изменять остальную часть проекта – Clamari

0

Наконец, это было решение для меня

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US"); 
@Html.HiddenFor(model => model.mx) 

добавив строку

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US"); 

перед моим спрятан решить эту проблему. спасибо за идеи и руководства!

Смежные вопросы