为什么 C# 的 NumberFormatInfo 返回法国文化的阿拉伯百分比符号?

问题描述 投票:0回答:1

如果执行此 C# 代码:

using System.Globalization;
using System;

public class HelloWorld
{
    public static void Main(string[] args)
    {
        CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("fr-FR");
        float p = 0.5f;
        Console.WriteLine(p.ToString("P0", CultureInfo.DefaultThreadCurrentCulture));
    }
}

显示结果为:

50 ٪

请注意,它使用“٪”(阿拉伯百分号 U+066A)而不是“%”(U+0025)

我找不到任何资源来解释这种行为。从语言学的角度来看这是否正确?

此外,与以下问题相关:“谁”负责在 C# 中实现适当的文化?是操作系统还是.NET框架?

我尝试过的事情

我尝试了不同的 C# 环境:我首先在 Unity 项目中发现了问题,然后创建了上述示例代码并在一些在线 C# 编译器工具中运行它。我使用的是 Windows 11 计算机,但该行为也在 Mac 中重现。我尝试了特定的法国文化和中性的法国文化。两者的效果是一样的

提前致谢,

c# localization cultureinfo french
1个回答
0
投票

此外,与以下问题相关:“谁”负责在 C# 中实现适当的文化?是操作系统还是.NET框架?

.NET(自 .NET 5 起) .NET 全球化和 ICU

.NET Framework 的文化数据不依赖于操作系统。相反,它拥有自己的内部文化信息数据库,用于确保不同操作系统之间的行为一致。这意味着 .NET 应用程序将在 Windows、Linux 和 macOS 上使用相同的区域性数据,前提是使用相同版本的 .NET 运行时。

要解决您的问题,您可以尝试设置正确的百分比符号:

CultureInfo frenchCulture = new CultureInfo("fr-FR");
frenchCulture.NumberFormat.PercentSymbol = "%";
CultureInfo.DefaultThreadCurrentCulture = frenchCulture;
float p = 0.5f;
Console.WriteLine(p.ToString("P0", CultureInfo.DefaultThreadCurrentCulture));
© www.soinside.com 2019 - 2024. All rights reserved.