Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.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# Xamarin表单条目小数分隔符在不同的CultureInfo上无法正常工作_C#_.net_Xamarin_Xamarin.forms - Fatal编程技术网

C# Xamarin表单条目小数分隔符在不同的CultureInfo上无法正常工作

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="

我在xaml中有一个条目:

<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));
            }
        }
    }