c# - 为什么 NumberFormatInfo 在 Azure 环境中的行为不同?
问题描述
我创建了一些用于 Razor 内容渲染的特定格式扩展:
public static class FormatExtension
{
private static CultureInfo BelgiumCulture { get; } = new CultureInfo("nl-BE");
private static NumberFormatInfo DecimalFormatInfo => BelgiumCulture.NumberFormat;
public static string FormatAmountN2(this decimal value)
{
FormattableString template = $"{value:N2}";
return template.ToString(DecimalFormatInfo);
}
}
执行此代码时:
Debug.WriteLine(12345m.FormatAmountN2());
我的开发环境中的输出是:
12.345,00
Azure 应用服务的输出是:
12 345,00
所以,空格“”而不是点“。” 用作组分隔符,这是错误的。
为什么我会遇到这种情况?
项目是带有 Razor 的 Asp.net Core 3.0
编辑:
我做了一些研究,我可以确认问题与 Azure 有关:
using System;
public class Program
{
public static void Main()
{
var format = new System.Globalization.CultureInfo("nl-BE", false).NumberFormat;
Console.WriteLine($"Decimal separator: {format.NumberDecimalSeparator}");
Console.WriteLine($"Group separator: {format.NumberGroupSeparator}");
}
}
当我在 .Net Fiddle 中运行此示例时,我得到了正确的结果 - 逗号和点。
https://dotnetfiddle.net/SONgb3
当我在https://try.dot.net中运行此示例时,该示例作为 Azure 函数执行(在某处偶然发现该信息),结果是错误的 - 逗号和空格。
解决方案
是的你是对的。我通过在本地调试与在托管的 Azure 函数应用中运行来验证此行为。作为一种解决方法,您可以使用以下代码:
var format = new System.Globalization.CultureInfo("nl-BE", false).NumberFormat;
format.NumberGroupSeparator = ".";
var value = 1234567;
FormattableString template = $"{value:N2}";
var ans = template.ToString(format);
Console.WriteLine($"Number seperated: {ans}");
Console.WriteLine($"Decimal separator: '{format.NumberDecimalSeparator}'");
Console.WriteLine($"Group separator: '{format.NumberGroupSeparator}'");
推荐阅读
- javascript - 点击跨度打开下拉菜单
- office-ui-fabric-react - ICommandBarItemProps 不支持焦点方法
- julia - 使用 Julia 实现递归函数返回的问题
- javascript - “gpu.js”如何操纵 GPU 线程?
- spring-boot - Hello World with Camel 3.4 + Spring boot 2
- vue.js - 如何在 nginx + vue.js 中显示自定义 500 页面?
- git - gitconfig shell-command 别名从顶层而不是当前目录运行
- string - 用于选择具有最新日期且不带子字符串的文件名的 Bash 脚本
- mysql - NodeJs 同步 MYSQL 查询和 Foreach
- node.js - 在控制器的“续集”中使用模型