You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将TextBox/TextBlock数值格式化为带两位小数的本地化货币?

UWP 货币格式格式化解决方案

一、TextBlock 绑定数值的货币格式化(只读展示)

对于绑定 ViewModel.Premium 的 TextBlock,直接在 x:Bind 中使用 StringFormat 就能实现类似 DisplayFormat="c2" 的效果,自动适配系统/线程的区域货币设置:

<TextBlock Text="{x:Bind ViewModel.Premium, StringFormat='C2'}" />
  • C2 格式说明:C 代表货币格式,2 指定保留两位小数。系统会根据当前线程的文化设置自动切换货币符号(如 $、€)、千分位分隔符和小数点样式,比如美式环境显示 $10.23,欧式环境显示 10,23 €。

如果需要更自定义的货币格式(比如强制指定文化),可以在代码中创建 CurrencyFormatter 并绑定,不过默认的 StringFormat='C2' 已经能满足自动识别全局配置的需求。

二、TextBox 数值的货币格式化(可编辑场景)

TextBox 本身没有直接的格式化属性,需要通过值转换器或事件处理实现双向绑定的格式化:

方法1:使用 IValueConverter 实现双向格式化

创建一个货币格式转换器类,处理数值与格式化字符串的双向转换:

public class CurrencyConverter : IValueConverter
{
    // 数值转格式化字符串
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (value is decimal amount)
        {
            // 使用当前文化的货币格式,保留两位小数
            return amount.ToString("C2");
        }
        return string.Empty;
    }

    // 格式化字符串转数值
    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        if (value is string text && decimal.TryParse(text, NumberStyles.Currency, CultureInfo.CurrentCulture, out decimal amount))
        {
            return amount;
        }
        // 解析失败时返回默认值或抛出异常,根据业务需求调整
        return 0m;
    }
}

在 XAML 中引用转换器并绑定:

<!-- 先在页面资源中声明转换器 -->
<Page.Resources>
    <local:CurrencyConverter x:Key="CurrencyConverter" />
</Page.Resources>

<!-- TextBox 绑定 -->
<TextBox Text="{x:Bind ViewModel.Premium, Mode=TwoWay, Converter={StaticResource CurrencyConverter}}" />
  • 转换器会自动使用当前线程的文化设置解析和格式化货币,保证和系统配置一致。

方法2:通过事件处理格式化(适合简单场景)

如果不想写转换器,可以在 TextBox 的 LostFocus 事件中手动格式化文本,同时处理输入解析:

private void TextBox_LostFocus(object sender, RoutedEventArgs e)
{
    if (sender is TextBox textBox && decimal.TryParse(textBox.Text, NumberStyles.Currency, CultureInfo.CurrentCulture, out decimal amount))
    {
        // 重新格式化为带两位小数的货币格式
        textBox.Text = amount.ToString("C2");
        // 更新 ViewModel 的值
        ViewModel.Premium = amount;
    }
}

XAML 中绑定并关联事件:

<TextBox Text="{x:Bind ViewModel.Premium, Mode=OneWay}" LostFocus="TextBox_LostFocus" InputScope="CurrencyAmount" />
  • 设置 InputScope="CurrencyAmount" 可以让输入法弹出适合货币输入的键盘,提升用户体验。

关于 NumberBox 的适用性

如果是只读信息展示,NumberBox 是更省心的选择:设置 IsReadOnly=true,并指定 NumberFormatter 为货币格式化器,自动适配系统区域:

<NumberBox IsReadOnly="true" Value="{x:Bind ViewModel.Premium}" >
    <NumberBox.NumberFormatter>
        <CurrencyFormatter DecimalDigits="2" />
    </NumberBox.NumberFormatter>
</NumberBox>

它会自动处理货币符号、小数位数和区域适配,不需要额外的转换器或事件处理。但如果是需要用户编辑的场景,NumberBox 也支持输入,但如果你的需求是用 TextBox 实现编辑,那还是用上面的转换器或事件方法更合适。

内容的提问来源于stack exchange,提问作者brainer33

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 18:05:29