Если ваше приложение должно поддерживать только определенный формат (или культуру), вы можете указать его в своем методе Configure
следующим образом:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
var cultureInfo = new CultureInfo("en-US");
cultureInfo.NumberFormat.NumberGroupSeparator = ",";
CultureInfo.DefaultThreadCurrentCulture = cultureInfo;
CultureInfo.DefaultThreadCurrentUICulture = cultureInfo;
[...]
}
Если вы хотите поддерживать несколько культур и автоматически выбирать правильную для каждого запроса, вместо этого вы можете использовать промежуточное программное обеспечение для локализации, например ::100100
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
[...]
var supportedCultures = new[]
{
new CultureInfo("en-US"),
new CultureInfo("es"),
};
app.UseRequestLocalization(new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture("en-US"),
// Formatting numbers, dates, etc.
SupportedCultures = supportedCultures,
// Localized UI strings.
SupportedUICultures = supportedCultures
});
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseMvc();
}
Подробнее здесь: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization?view=aspnetcore-2.2
Правка - Десятичный переплет
Если все вышеперечисленное не помогло, вы также можете свернуть свою собственную модель, например ::11015.
public class CustomBinderProvider : IModelBinderProvider
{
public IModelBinder GetBinder(ModelBinderProviderContext context)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
if (context.Metadata.ModelType == typeof(decimal))
{
return new DecimalModelBinder();
}
return null;
}
}
public class DecimalModelBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (valueProviderResult == null)
{
return Task.CompletedTask;
}
var value = valueProviderResult.FirstValue;
if (string.IsNullOrEmpty(value))
{
return Task.CompletedTask;
}
// Remove unnecessary commas and spaces
value = value.Replace(",", string.Empty).Trim();
decimal myValue = 0;
if (!decimal.TryParse(value, out myValue))
{
// Error
bindingContext.ModelState.TryAddModelError(
bindingContext.ModelName,
"Could not parse MyValue.");
return Task.CompletedTask;
}
bindingContext.Result = ModelBindingResult.Success(myValue);
return Task.CompletedTask;
}
}
Не забудьте зарегистрировать пользовательское связующее в вашем методе ConfigureServices
:
services.AddMvc((options) =>
{
options.ModelBinderProviders.Insert(0, new CustomBinderProvider());
});
Теперь каждый раз, когда вы используете десятичный тип в любой из ваших моделей, он будет анализироваться вашим пользовательским механизмом связывания.