【问题标题】:ILogger displays incorrect currency SymbolILogger 显示不正确的货币符号
【发布时间】:2018-08-06 14:30:13
【问题描述】:

当我尝试使用 ILogger.LogInformation() 输出带有货币格式说明符的数值时,我得到一个与使用 Console.Log(string.Format()) 时不同的意外符号。后者将预期的美元符号显示为符号,而前者则显示不可打印的内容。

示例代码

var services = new ServiceCollection();
services.AddLogging(x =>
{
    x.AddDebug();
    x.AddConsole();
});
var svcProvider = services.BuildServiceProvider();
var logger = svcProvider.GetRequiredService<ILoggerFactory().CreateLogger<Program>();
logger.LogInformation("Amount {0:C}", 100.0);
System.Diagnostics.Debug.WriteLine(string.Format("Amount {0:C}", 100.0));

调试输出

xyz.Program:信息:金额 ¤100.00

金额 $100.00

我知道为 ILogger 配置 CultureInfo 的已知方法,我不想在每次编写时都指定它。另外,我认为这无关紧要,但代码是在 async 方法中执行的。

这是一个错误,是我的期望不切实际,还是我做错了什么?

【问题讨论】:

  • 仅供参考,那个不可打印的字符被称为“圣甲虫”:en.wikipedia.org/wiki/Currency_sign_(typography)
  • ILogger 只是接口。应在配置期间设置本地化。内置记录器的功能有限,但在 this 的情况下,我不得不问为什么要这样做?应用程序只处理 一种 货币的可能性很小。如果存在隐含货币,则它不应出现在日志中以避免引起混淆
  • IMO 打印该符号是正确的行为。您的日志不应依赖于用户当前的文化。 ¤ 表示货币。
  • @DanielGimenez 解释为什么你想先在这里做你想做的事情。 LogInformation 当场格式化消息,然后记录下来。如果您想要不同的东西,请使用不同的提供程序,例如 Serilog。 货币虽然是不能隐含的商业信息
  • @DanielGimenez LogInformation 使用 InvariantCulture 除非您指定其他内容。在大多数情况下,日志不应受语言环境的影响。 1.4.ToString("C",CultureInfo.InvariantCulture) 返回¤1.40ToString() 虽然使用受服务器区域设置和/或配置设置影响的当前文化。在我的情况下,1.4.ToString("C") 返回1,40 €

标签: c# .net-core cultureinfo


【解决方案1】:

显然,这种行为的原因是日志不应该特定于任何语言环境。我在 Microsoft.Extensions.Logging.Abstractions 存储库中搜索了解决方法或设置,但似乎没有办法规避这种行为。

(几乎)ILogger 的所有日志记录方法都来自静态扩展类,LoggerExtensionsILogger 定义了一个 Log直接使用会很痛苦的方法)。该类中的所有方法最终都会调用相同的 Log 方法,该方法将消息格式及其参数转换为 FormattedLogValues 对象。

FormattedLogValues 对象有一个静态缓存,由具有 LogValuesFormatter 值的格式字符串键入。这些格式化程序负责将消息和参数转换为字符串,并在调用string.Format 时将区域性显式设置为CultureInfo.InvariantCulture。这就是使用货币格式说明符时显示“圣甲虫”符号 (¤) 的原因。

由于我知道我的所有金额都将以美元为单位,因此最简单和最正确的解决方案是避免使用客户数字格式字符串的货币说明符。

logger.LogInformation("Amount {0:$#,##0.00}", 100.0);

感谢 @Amy 和 @PanagiotisKanavos 提供的所有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多