首页 > 解决方案 > 尝试将字符串条目解析为双精度,但小数点永远无法识别

问题描述

他们说要玩 CultureInfo 的地方有多个线程,但对我没有任何帮助。

我有一个 Xamarin.Forms 应用程序,用户输入一个字符串值,可以写成 90、90.1 或 90,9。然后将该值转换为 double 以进行一些计算。

xamarin 条目组件具有“数字”属性,因此用户只能输入数字和点或逗号,具体取决于设备的语言。

因为我一开始并不知道语言对点或逗号很重要,所以这是我的第一个实现:

public static double CalculateExposition(TasksGroup group)
{
    return Math.Round(10 * Math.Log10(group.Taches.Sum(x =>
        GetDuration(x.TaskDuration).TotalHours * Math.Pow(10, double.Parse(x.TaskDBA.Replace(",", ".")) / 10.0)) / 8), 1);
}

您可以在下面查看更多详细信息,非常感谢您的帮助。

问题

这在 VS 2017 上的法语模拟器上运行良好(不知何故,我没有键盘限制,可以做逗号和点),直到我将我的应用程序从 vs 2017 升级到 2019 并使用使用 . 为小数点。

当我尝试使用英文模拟器时,这一点永远不会被识别,所以如果我输入 90.9,它将被识别为 909。

我尝试了什么(在他们说要使用 CultureInfo 的所有线程中,但它对我没有任何作用)

我尝试的另一件事是为允许用户使用的键盘实现自定义渲染器,或者。但显然我需要它基于语言。

public static double CalculateExposition(TasksGroup group)
{
    return Math.Round(10 * Math.Log10(group.Taches.Sum(x =>
        GetDuration(x.TaskDuration).TotalHours * Math.Pow(10, double.Parse(x.TaskDBA.Replace(",", "."), NumberStyles.Any, CultureInfo.InvariantCulture) / 10.0)) / 8), 1);
}

标签: c#xamarinxamarin.forms

解决方案


您可以使用此扩展方法:

static class StringExtensions
    {
        private static readonly CultureInfo Fr = new CultureInfo("fr-FR");

        public static decimal ToDecimal(this string value)
        {
            if (value.Contains(','))
                return decimal.Parse(value, Fr);

            return decimal.Parse(value, CultureInfo.InvariantCulture);
        }
    }

如果输入字符串包含逗号,则使用法语文化对其进行解析。如果没有,它将包含一个点或什么都没有。所以用InvariantCulture(英语文化)解析它就可以了。


推荐阅读