Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用区域性将绑定格式化为这样的双精度?_C#_Wpf_String Formatting - Fatal编程技术网

C# 如何使用区域性将绑定格式化为这样的双精度?

C# 如何使用区域性将绑定格式化为这样的双精度?,c#,wpf,string-formatting,C#,Wpf,String Formatting,我的ViewModel上有一个双值,并希望绑定TextBlock的文本,以便: 128228.094545被格式化为128228[x]09,其中[x]是根据计算机区域性设置的十进制分隔符 我试过: Text="{Binding Value, StringFormat='{}{0:F2}'}" 不起作用:无论十进制分隔符符号是否正确,该值都将显示为128228.09 Text="{Binding Value, StringFormat='{}{0:N2}'}" 呈现我不想要的数字分组符号([d

我的ViewModel上有一个双值,并希望绑定TextBlock的文本,以便:

128228.094545被格式化为128228[x]09,其中[x]是根据计算机区域性设置的十进制分隔符

我试过:

Text="{Binding Value, StringFormat='{}{0:F2}'}"
不起作用:无论十进制分隔符符号是否正确,该值都将显示为128228.09

Text="{Binding Value, StringFormat='{}{0:N2}'}"
呈现我不想要的数字分组符号([d],在en-US中为y):128[d]228[x]09

Text="{Binding Value, StringFormat='{}{0:0.00}'}"
显然不行


什么是正确的格式字符串?

我认为您的第一个定义是正确的。问题是,格式化总是基于设置的区域性进行的。不知道你到底在使用什么,但这取决于如何为你的应用设置文化

这里有一篇很好的博客文章描述了WPF的文化,因为手动定义文化存在一些问题


我认为问题在于,在数据绑定中使用StringFormat时,它不尊重当前的文化

在过去,我使用了一种简单的方法来设置值的格式。如果您的应用程序允许用户指定所有数字的格式选项,例如小数位数,则此选项非常有用。或者,您可以使用ConverterParameter指定格式字符串,只需返回:

String.Format(CultureInfo.CurrentCulture, converterParameter, value)
如果不需要使用前缀或后缀围绕值,则以下转换器应允许您转换格式化值:

public class StringFormatConverter : IValueConverter
{
    public object Convert(object value, Type targetType,
                          object parameter, CultureInfo culture)
    {
        var parameterString = parameter as string;
        if (value != null && parameterString != null)
        {
            return String.Format(CultureInfo.CurrentCulture, "{0:"+ parameterString + "}", value);
        }
        else
        {           
            return string.Empty;
        }
    }


    public object ConvertBack(object value, Type targetType,
                              object parameter, CultureInfo culture)
    {
        if (targetType == typeof (double))
        {
            return System.Convert.ToDouble(value, CultureInfo.CurrentCulture);
        }
        else if (targetType == typeof(int))
        {
            return System.Convert.ToInt32(value, CultureInfo.CurrentCulture);
        }
        // Any other supported types
        else
        {
            throw new NotImplementedException();
        }
    }
}

尚未使用WPF,但不会使用
StringFormat='{}{0:#########}
(或者简单地说
StringFormat='{0:###}
)工作吗?不,因为这会导致“.”始终,尽管区域性可能有逗号。我希望应用当前的区域性,而不是自定义区域性,但显然,WPF忽略了它。谢谢我,你介意把信寄回去吗?要单独处理每个可能的数字TargetType?根据TargetType,您应该能够使用System.Convert,即
System.Convert.ToDouble(value,CultureInfo.CurrentCulture)
。我稍后会尝试更新答案。