我正在使用Xamarin Forms开发一个应用程序,它的目的是使用用户类型的值执行一些计算。有些值是很大的数字,比如百万或十亿,我需要在用户键入时显示千位分隔符,这样他们就不必计算条目上的零。此外,这些都是整数值,不能显示小数点。
例如,当用户输入9000
时,条目应该显示9.000
。然后,当他们添加另一个0时,千位分隔符应该重新定位以显示90.000
,等等。
仅供参考:应用程序文化设置为pt-BR,所以千位分隔符是一个点,小数点分隔符是一个逗号。
我尝试简单地将条目的文本绑定设置为<Entry Text="{Binding MyObj.MyIntNumber, Mode=TwoWay, StringFormat='{}{0:N0}'}"/>
,但是它只添加第一个分隔符并且只考虑前4位数字。
我发现这个货币转换器可以根据我的需要进行数千种格式,所以我试图将.ToString("C")
更改为.ToString("N0")
,并将条目的文本绑定设置为<Entry Text="{Binding MyObj.MyIntNumber, Mode=TwoWay, Converter={StaticResource ThousandsConverter}}"/>
,但它不起作用,输入的文本未显示在条目中。
我决定取消删除这个问题,因为经过许多小时和测试,我设法修改了货币转换器代码,我发现它可以按照我想要的方式格式化我的整数值。这是我的解决方案:
public class ThousandsSeparatorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
NumberFormatInfo nfi = culture.NumberFormat;
var temp = Int32.Parse(value.ToString()).ToString("N0");
return temp;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
string valueFromString = Regex.Replace(value.ToString(), @"D", "");
if (valueFromString.Length <= 0)
return 0L;
long valueLong;
if (!long.TryParse(valueFromString, out valueLong))
return 0L;
if (valueLong <= 0)
return 0L;
return valueLong;
}
}
希望它能帮助到别人。