C# Xamarin表单条目小数分隔符在不同的CultureInfo上无法正常工作
我在xaml中有一个条目:C# Xamarin表单条目小数分隔符在不同的CultureInfo上无法正常工作,c#,.net,xamarin,xamarin.forms,C#,.net,Xamarin,Xamarin.forms,我在xaml中有一个条目: <Entry Grid.Column="1" Grid.RowSpan="1" FontAttributes="None" FontSize="Large" IsPassword="False" Keyboard="
<Entry Grid.Column="1" Grid.RowSpan="1"
FontAttributes="None" FontSize="Large"
IsPassword="False" Keyboard="Numeric"
HorizontalTextAlignment="Center" VerticalOptions="StartAndExpand"
Text="{Binding MyNumber}"
TextColor="{Binding PropertyTextColor, Converter={StaticResource StringToColorConverter}}"
Completed="Entry_Completed"/>
有没有办法解决这个问题?因为据我所知,这个问题与三星的配置或设置有关,在Xamarin中这是一个非常常见的问题。在我的例子中,我最终需要强制使用点作为每个区域性的小数分隔符。为了打印点,我还需要为条目创建一个自定义渲染器,以便重新设置InputTypes标志 如果这听起来像是你想要遵循的方式,继续阅读 下面是一个示例minimal应用程序,演示如何在Android中强制使用点作为Xamarin.Forms的小数分隔符 强制将点作为小数点分隔符 首先,我们必须告诉应用程序,无论使用何种区域性,都必须将点作为小数分隔符:
public应用程序()
{
CultureInfo customCulture=(CultureInfo)System.Threading.Thread.CurrentThread.CurrentCulture.Clone();
customCulture.NumberFormat.NumberDecimalSeparator=“.”;
System.Threading.Thread.CurrentThread.CurrentCulture=customCulture;
初始化组件();
主页=新主页();
}
重新设置输入类型
在Xamarin.Forms共享项目上创建自定义条目:
使用Xamarin.Forms;
名称空间入口十进制
{
公共类MyCustomEntry:Entry
{
}
}
然后在Android上添加自定义渲染器。为此,只需向Android项目添加一个名为AndroidCustomEntryRenderer.cs的新类,该类包含以下内容:
使用System.ComponentModel;
使用Android.Widget;
使用Xamarin.Forms;
使用Xamarin.Forms.Platform.Android;
使用Android.Text.Method;
使用Android.Content;
使用EntryDecimal.Droid;
使用EntryDecimal;
[程序集:ExportRenderer(typeof(MyCustomEntry)、typeof(AndroidCustomEntryRenderer))]
名称空间EntryDecimal.Droid
{
公共类AndroidCustomEntryRenderer:EntryRenderer
{
私有输入元素;
私人编辑文本;
公共AndroidCustomEntryRenderer(上下文):基础(上下文)
{ }
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
//Java.Text.DecimalFormatSymbols.Instance.DecimalSeparator=';
元素=(MyCustomEntry)元素??空;
native=控件作为EditText;
UpdateKeyboard();
}
受保护的覆盖无效OnElementPropertyChanged(对象发送方,PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(发送方,e);
if(Control==null)返回;
else if(e.PropertyName==InputView.KeyboardProperty.PropertyName)
UpdateKeyboard();
}
私有void UpdateKeyboard()
{
//数字键盘的实现(我们只需添加NumberFlagSigned)
native=控件作为EditText;
var defaultNumericKeyboard=Android.Text.InputTypes.ClassNumber | Android.Text.InputTypes.NumberFlagDecimal;
var correnctNumericKeyboard=Android.Text.InputTypes.ClassNumber | Android.Text.InputTypes.NumberFlagSigned | Android.Text.InputTypes.NumberFlagDecimal;
if(native.InputType==defaultNumericKeyboard)
{
本地输入类型=
Android.Text.InputTypes.ClassNumber|
Android.Text.InputTypes.NumberFlagSigned|
Android.Text.InputTypes.NumberFlagDecimal;
native.keylister=digitskeylister.GetInstance(string.Format(“7890.-”);
}
else if(native.InputType==correnctNumericKeyboard)
{
//即使在下一行中,InputType被设置为与已设置的相同,这似乎是错误的
//修复十进制分隔符的问题:即,设置了非英语的本地值,即点
//对数字键盘没有任何影响。重新设置InputType似乎可以解决此问题。
本地输入类型=
Android.Text.InputTypes.ClassNumber|
Android.Text.InputTypes.NumberFlagSigned|
Android.Text.InputTypes.NumberFlagDecimal;
}
}
}
}
最后,消费这个:
这个最小的空白应用程序在我这方面工作正常,接受点作为任何文化的小数分隔符(比如de[german],其中小数分隔符是“,”)
希望这能奏效 如果只执行
decimal.TryParse
而不使用任何其他逻辑,它是否工作。NET应该为您处理这个问题,而不需要所有这些额外的工作。我不确定它是否有效,因为我在设置调试器时已经从setter上的5,5->55中获益,我可以看到得到的值已经是55,而不是5,5。所以我想解析并没有起到很大的作用。
private decimal _myNumber;
public decimal MyNumber
{
get
{
return myNumber;
}
set
{
System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
if (_myNumber != value)
{
if (IsDivisible)
//_myNumber = Convert.ToDecimal(Math.Round(value, 2).ToString(), new CultureInfo("pl-PL"));
_ = decimal.TryParse(value.ToString(), NumberStyles.Any, new CultureInfo("pl-PL"), out _count);
else
_ = decimal.TryParse(value.ToString(), NumberStyles.Any, new CultureInfo("pl-PL"), out _count);
// _myNumber = Convert.ToDecimal(Math.Round(value, 0).ToString(), new CultureInfo("pl-PL"));
OnPropertyChanged(nameof(Count));
}
}
}