我想格式化绑定到数据网格中的单元格/列的货币值。
相关的XAML如下:
<telerik:RadGridView Grid.Row="0" Grid.ColumnSpan="2" x:Name="dataGrid"
AutoGenerateColumns="False" HorizontalAlignment="Stretch"
VerticalAlignment="Top" Margin="0,25,0,0" IsSearchingDeferred="True"
IsReadOnly="True" IsLocalizationLanguageRespected="False">
<telerik:RadGridView.Columns>
<telerik:GridViewDataColumn DataMemberBinding="{Binding Path=VALUATION, StringFormat=C}"
Header="{x:Static properties:Resources.AddressLine3}"/>
</telerik:RadGridView.Columns>
</telerik:RadGridView>
这是当前绑定到列的值(该值来自数据库的数字文字):
12345678.90
这是将文化设置为en-US
12345678.90 //notice the decimal point
这是将文化设置为nl-NL
12345678,90 //notice the comma
您可以看到文化在某种程度上受到尊重。但是,输出并不是我所期望的。
对于en-US
文化,我希望输出为$12,345,678.90
。对于nl-NL
文化,我希望输出为€ 12.345.680,00
。
在我的XAML代码中,使用以下代码手动设置文化(用于测试目的):
public MainWindow()
{
//I am toggling between the following cultures
CultureInfo ci = new CultureInfo("nl-NL");
//CultureInfo ci = new CultureInfo("ja-JP");
//CultureInfo ci = new CultureInfo("en-US");
//I am forcing the UI to use the culture I specify
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;
this.Language = XmlLanguage.GetLanguage(ci.Name);
Properties.Resources.Culture = ci;
//these are used to test that to string formatting works as expected
//when using the debugger
float price = 12345678.90F;
string currencyToDisplay = price.ToString("C");
InitializeComponent();
}
问题
为什么不显示货币符号和数字分隔符的格式,即使我已将格式指定为货币?
手动,在后面的代码中格式化相同的数字给了我想要的结果,但我想在XAML中这样做。
我尝试了什么 我尝试了以下变通方法无济于事:
<telerik:GridViewDataColumn DataMemberBinding="{Binding Path=VALUATION, StringFormat=C}" Header="{x:Static properties:Resources.AddressLine3}"/>
<telerik:GridViewDataColumn DataMemberBinding="{Binding Path=VALUATION, StringFormat={}{0:C}}" Header="{x:Static properties:Resources.AddressLine3}"/>
<telerik:GridViewDataColumn DataMemberBinding="{Binding Path=VALUATION, StringFormat=\{0:C\}}" Header="{x:Static properties:Resources.AddressLine3}"/>
<telerik:GridViewDataColumn DataMemberBinding="{Binding Path=VALUATION, StringFormat='C'}" Header="{x:Static properties:Resources.AddressLine3}"/>
<telerik:GridViewDataColumn DataMemberBinding="{Binding Path=VALUATION, StringFormat=c}" Header="{x:Static properties:Resources.AddressLine3}"/>
<telerik:GridViewDataColumn DataMemberBinding="{Binding VALUATION}" DataFormatString="{}{0:C}" Header="{x:Static properties:Resources.AddressLine3}"/>
我有什么遗失的吗?
答案 0 :(得分:2)
正如我们在评论中所说的那样
未显示货币符号的可能原因是您使用的UserControl
未使用正确的文化。当我使用DynamicResource
设置Button
样式而不在xaml中包含ResourceDictionary
时,我发现了类似的行为。我的意思是风格部分应用,就像你的情况,当点变成逗号但没有货币符号时
强制UserCpntrol
使用所需文化的一种方法是将此代码段包含在UserControl
xaml文件中:
<UserControl x:Class="WpfApplication1.Views.CultureExplicitUC"
xml:lang="en-GB"<!--This is what you want in your UC-->
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WpfApplication1.Views"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
</Grid>
</UserControl>
现在对于转换器,您需要创建如下所示的类:
namespace WpfApplication1.Converters
{
public class DebugConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
//manipulate your data here
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
请注意,转换器有一个cultureInfo作为参数,因此如果需要,您可以根据开发环境手动更改它。
此外,通过使用转换器,您可以通过执行简单检查来确定传入的数据类型,如:
if(value is int)