簡體   English   中英

嘗試將字符串條目解析為雙精度值,但永遠無法識別小數點

[英]Trying to parse a string entry into a double but the point for the decimal is never recognized

對此有多個線程,他們說要使用 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);
}

您可以使用此擴展方法:

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 (英國文化)解析它就可以了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM