在 .NET 8 中使用 IFormattable 实现企业应用程序的全局格式化变得容易

Avatar
不若风吹尘
2024-06-09T16:53:08
307
0

在当今互联互通的世界中,企业应用程序必须满足跨越多个地区和文化的不同用户群体的需求。一个经常被忽视的关键方面是财务数据的呈现,其中格式化的细微差别会极大地影响用户体验和数据准确性。

在这篇文章中,我们将探讨在 .NET 8 中实现并利用 IFormattable 接口的 Money 类如何彻底改变全球财务数据的呈现方式,确保在不同地区保持一致和与文化相关。

了解 Money 类

Money 类是企业应用程序中表示货币价值的基石。它封装了金额和货币代码,为金融交易提供了一个强大且不可变的数据结构。

通过利用 .NET 8 中引入的记录功能,Money 类受益于内置的不可变性、基于值的相等性以及用于对象创建和操作的简单语法。

public record Money(decimal Amount, string CurrencyCode) : IFormattable
{
    private static MoneyFormatter Formatter { get; } = new();

    public string ToString(string? format, IFormatProvider? formatProvider) =>
        MoneyFormatter.Format(this, format, formatProvider);
}

IFormattable 的文化兼容性

Money 类的核心是实现 IFormattable 接口。该接口允许 Money 对象被格式化为适合全球用户文化偏好的字符串表示形式。

无论是显示货币符号、十进制分隔符还是千位分组,IFormattable 接口都确保在不同地区准确而清晰地呈现货币值。

public sealed class MoneyFormatter
{
    private static ConcurrentDictionary<string, string> CurrencySymbolsCache { get; } = new();

    public static string Format(Money money, string? format, IFormatProvider? formatProvider)
    {
        formatProvider ??= CultureInfo.CurrentCulture;
        format = EnsureValidFormat(format);

        return format.ToUpperInvariant() switch
        {
            "N" => FormatAsNumber(money, formatProvider),
            "C" => FormatAsCurrency(money, formatProvider),
            _ => throw new FormatException($"The {format} format string is not supported.")
        };
    }

    // ...
}

使用 xUnit 和 FluentAssertions 进行测试

为了验证 Money 类和 MoneyFormatter 的功能,全面的单元测试是必不可少的。我们利用 xUnit 测试框架和 FluentAssertions 来严格测试各种文化场景下的格式化逻辑。

using System.Globalization;
using Xunit;
using FluentAssertions;

public class MoneyTests
{
    [Theory]
    [InlineData(1234.56, "USD", "en-US", "1,234.56 USD")]
    [InlineData(1234.56, "EUR", "de-DE", "1.234,56 EUR")]
    public void Money_ToString_FormatsCorrectlyForGivenCulture(decimal amount, string currencyCode, string culture, string expected)
    {
        // Arrange
        var money = new Money(amount, currencyCode);
        var cultureInfo = new CultureInfo(culture);

        // Act
        var result = money.ToString("N", cultureInfo);

        // Assert
        result.Should().Be(expected);
    }
}

结论

在日益全球化的商业环境中,准确并与文化相关地呈现财务数据的能力至关重要。通过实现 Money 类和 MoneyFormatter 实用程序,我们的企业应用程序现在可以无缝地适应全球不同用户群体。

通过接受文化兼容性和精心测试的原则,我们为在全球金融领域增强用户体验和授权决策铺平了道路。

Last Modification : 4/30/2025 9:06:24 PM


In This Document