Skip to content

Commit

Permalink
~
Browse files Browse the repository at this point in the history
  • Loading branch information
badhitman committed Aug 28, 2019
1 parent 3ab2206 commit 662c12c
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 10 deletions.
2 changes: 1 addition & 1 deletion CustomFloatingModelBinder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public Task BindModelAsync(ModelBindingContext model_binding_context)
// Таким образом исключаем точки в начале или в конце строки:
// ".5" -> "0.50"
// "5." -> "05.0"
if (FloatSeparator.IsMatch(FieldValueAsString))
if (FloatSeparator.IsMatch(FieldValueAsNormalString))
FieldValueAsNormalString = "0" + FieldValueAsNormalString + "0";

////////////////////////////////////////////////////
Expand Down
30 changes: 21 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,22 @@
Привязчик модели в ASP.NET Core 2.2 для числовых значений с плавающей точкой **[double, float или decimal]**

Известная особенность стандартного привязчика модели в ASP.NET Core 2.2 заключается в том, что нельзя использовать типы значений с плавающей запятой.
Все числовые значения встроеный привязчик модели пытается обработать как целочисленные, даже если тип свойства модели объявлен как [double, float или decimal].
Данный привязчик модели исправляет не только эту проблему, но и освобождает пользователя от ограничения использования дробного разделителя (точка или запятая).
Все числовые значения встроеный привязчик модели пытается обработать как целочисленные, даже если тип свойства модели объявлен как число с плавающей точкой.
Отсюда становится проблематичным использования в формах модели со свойствами типов [double, float или decimal].

Данный привязчик модели исправляет не только эту проблему, но и освобождает пользователя от ограничения использования дробного разделителя (точка или запятая).
Данный привязчик позволяет использовать любой разделитель дроби. Любой разделитель принудительно замениться на системный перед конвертацией.
Кроме того допускается усечённый формат записи чисел. Например: 0,5 и .5 дадут один результат. Равно как и 5.0 == 5. Эта особенность выглядет спорной => можно закомментировать эту часть.

```C#
// Regex FloatSeparator = new Regex(@"[.,]", RegexOptions.Compiled)
////////////////////////////////////////////////////
// заменим дробный разделитель на текущий системный
FieldValueAsNormalString = FloatSeparator.Replace(FieldValueAsNormalString, CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator);
```

Кроме того допускается усечённый формат записи чисел. Например: 0,5 и .5 дадут один результат. Равно как и 5.0 == 5.
Эта особенность выглядет неоднозначной и спорной => можно закомментировать эту "обработку значения" .

```C#
if (FloatSeparator.IsMatch(FieldValueAsString))
FieldValueAsNormalString = "0" + FieldValueAsNormalString + "0";
```
Expand All @@ -20,16 +28,20 @@ protected readonly Regex FloatPattern = new Regex(@"^(-?)[0-9]*(?:[.,][0-9]*)?$"
```
Проверьте его что бы оно отвечало поставленым задачам в вашем контексте

Использование:
Использование в вашем проекте:
```C#
using AspDotNetCore2BinderFloatingDecimalModel;
// ...
public void ConfigureServices(IServiceCollection services)
public class Startup
{
// ...
services.AddMvc(opts =>
public void ConfigureServices(IServiceCollection services)
{
opts.ModelBinderProviders.Insert(0, new CustomDecimalModelBinderProvider());
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
// ...
services.AddMvc(opts =>
{
opts.ModelBinderProviders.Insert(0, new CustomDecimalModelBinderProvider());
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
}
```

0 comments on commit 662c12c

Please sign in to comment.