Convert.ChangeType показывает входные данные FormatException на другом языке - PullRequest
0 голосов
/ 31 октября 2018

В моей базе данных я сохраняю тип и значение значения в строках, а затем при необходимости преобразую его обратно в динамический объект. Хотя конверсия кажется неудачной при использовании французско-канадского маршрута.

Ниже приведены инструкции по быстрому воссозданию ошибки с использованием шаблона основного веб-приложения ASP.NET (2.1 MVC):

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.Configure<RequestLocalizationOptions>(options =>
    {
        var supportedCultures = new[]
        {
            new CultureInfo("en-CA"),
            new CultureInfo("fr-CA")
        };

        options.DefaultRequestCulture = new RequestCulture("en-CA");
        options.SupportedCultures = supportedCultures;
        options.SupportedUICultures = supportedCultures;
        options.RequestCultureProviders = new List<IRequestCultureProvider>
        {
            new RouteDataRequestCultureProvider()
        };
    });
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    ...
    var options = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
    app.UseRouter(routes =>
    {
        routes.MapMiddlewareRoute("{culture=en-CA}/{*mvcRoute}", subApp =>
        {
            subApp.UseRequestLocalization(options.Value);

            subApp.UseMvc(mvcRoutes =>
            {
                mvcRoutes.MapRoute(
                    name: "default",
                    template: "{culture=en-CA}/{controller=Home}/{action=Index}/{id?}");
            });
        });
    });
}

HomeController.cs

[Route("{culture=en-CA}")]
public class HomeController : Controller
{
    [Route("")]
    public dynamic Index()
    {
        return Convert.ChangeType("1,0", Type.GetType("System.Decimal"));
    }
}

Я заметил следующее, когда играл со строкой значения:

GET / или GET / en-CA

"1"   => "1.0"
"1.0" => "1.0"
"1,0" => "10.0"

GET / FR-CA

"1"   => "1.0"
"1.0" => Error
"1,0" => "1.0"

Я не хочу локализовать числа, так как мне вывести все в десятичной записи (1.0)?

1 Ответ

0 голосов
/ 31 октября 2018

Когда вы конвертируете в / из строки на границе базы данных приложения, передайте CultureInfo.InvariantCulture в качестве третьего параметра Convert.ChangeType.

Например, при чтении из базы данных:

Convert.ChangeType("1.0", Type.GetType("System.Decimal"), CultureInfo.InvariantCulture)

... и при сохранении в базу данных:

Convert.ChangeType(1.0M, typeof(string), CultureInfo.InvariantCulture)

Тогда база данных всегда будет иметь одинаковый формат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...