【问题标题】:Angular uses comma instead of dot as decimal separator after changing cultureAngular 在更改文化后使用逗号而不是点作为小数分隔符
【发布时间】:2020-04-07 15:04:48
【问题描述】:

我为本地化功能添加了多种文化,将 NumberDecimalSeparator 和 CurrencyDecimalSeparator 设置为“。”为他们所有人。然而,在将文化更改为“es”时,前端 Angular 仍然显示逗号。

Startup.cs

private List<CultureInfo> cultures = new List<CultureInfo>()
            {   new CultureInfo("es"),
                new CultureInfo("en"),
                ....
            }; 

在配置服务中:

services.Configure<RequestLocalizationOptions>(
               opts =>
               {

                   cultures.ForEach(c => c.NumberFormat.NumberDecimalSeparator = ".");
                   cultures.ForEach(c => c.NumberFormat.CurrencyDecimalSeparator = ".");
                   opts.RequestCultureProviders.Insert(0, new CustomRequestCultureProvider(context =>
                   {
                       var userLang = context?.Request?.Cookies["locale"]?.ToString();   
                       var lang = string.IsNullOrEmpty(userLang) ? "es" : userLang;   
                       return Task.FromResult(new ProviderCultureResult(lang, "en"));
                   }));                       
                   opts.SupportedCultures = cultures;                   
                   opts.SupportedUICultures = cultures;
               });

在配置中:

var op = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
 app.UseRequestLocalization(op.Value);

 app.UseRewriter(new RewriteOptions().AddRedirect("index.html", "/"));

 app.UseMvc(routes =>
                {routes.MapRoute(
                        name: "default",
                        template: "{controller}/{action=Index}/{id?}"); });

在控制器操作中,我正在检查是否有逗号被替换为点:

var rqf = Request.HttpContext.Features.Get<IRequestCultureFeature>();           
 var culture = rqf.RequestCulture.Culture;

是的,它是:

显然 Angular 忽略了这些设置,有什么想法吗? 任何关于文化如何传递给 Angular 的信息? 任何方式将响应文化设置为“en”?

【问题讨论】:

    标签: c# angular .net-core


    【解决方案1】:

    你似乎很不走运。语言环境当前与货币的前端描述无关。

    Feature request in the angular repository。当前提供的解决方案(似乎即使在 9.0 版本的 angular 中也不会应用这个全局货币处理程序),是在货币管道的任何地方应用。

    似乎将货币与语言环境相关联被认为是一种不好的做法。

    @MickL 让我举个例子说明为什么只使用 LOCALE_ID 的方法会导致问题。 假设我有一个提供德语 (de) 和英语 (en) 的应用程序。我在这个应用程序中有欧元价格。 您的方法意味着当我将 LOCALE_ID 更改为 en 时,我的价格会从欧元切换到 GBR。 使用 CURRENCY_ID 时,它们是分开的,可以单独更改。

    这几乎是说 UI 在收到数字时不知道您的格式。如果您以数字形式发送美元,并且网站是德语,那么它是否需要一个汇率转换器,或者以欧元或美元显示相同的金额。

    而且由于这可能取决于位置、服务和合理性,我们几乎无法在任何地方使用管道和格式化指令(尤其是在输入中)。

    【讨论】:

      【解决方案2】:

      我知道答案已被接受,但也许它对您有用。

      您可以将语言环境从后端发送到前端,然后只需应用货币管道。

      C#:

      [HttpPost]
      public async Task<IActionResult> Post([FromBody]FooDto fooDto)        
      {
          return Ok({Locale = "CAD"});
      }
      

      打字稿:

      myLocale: string;
      

      HTML:

      <p>A: {{ a | currency: myLocale }}</p>
      

      更多例子可以看here

      【讨论】:

        猜你喜欢
        • 2015-10-15
        • 1970-01-01
        • 2012-09-28
        • 1970-01-01
        • 2017-09-30
        • 1970-01-01
        • 2014-07-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多