【发布时间】: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.40。ToString()虽然使用受服务器区域设置和/或配置设置影响的当前文化。在我的情况下,1.4.ToString("C")返回1,40 €。
标签: c# .net-core cultureinfo