如何将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
相关产品推荐
相关产品推荐

