将 String 解析为 double 时出现 System.FormatException

问题描述 投票:0回答:3

代码在 Unity 中运行良好。现在我在控制台项目中使用相同的代码,但出现了 System.FormatException 异常。

代码是:

private double ConvertToNumber(string number)
        {      
            return double.Parse(number, numberStyle);
        }

调用时参数为:

number = "3.138924e-002"
numberStyle = NumberStyles.AllowExponent | NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign

有人看到错误,或者知道可能导致此错误的原因吗?

c# string parsing double exponent
3个回答
1
投票

抛出异常是因为您提供的字符串无法使用您指定的格式和您自己的当前文化转换为数字。后者是隐含的,除非您指定它。

如果您从数据库中读取此值,则应使用不变区域性(即,旨在以一致的方式在除用户界面之外的任何地方以一致的方式保留数字和日期的区域性)。

您的代码变为:

return double.Parse(number, numberStyle, System.Globalization.CultureInfo.InvariantCulture);

相反,如果您需要特定的文化,则需要传递正确的文化来代替不变的文化。


0
投票

@Selvin 关于 CultureInfo.InvariantCulture 将其添加为参数修复了错误,这是正确的。

return double.Parse(number, numberStyle, CultureInfo.InvariantCulture);

0
投票

以前的答案工作得很好,但我仍然需要考虑在文本框中首先输入“-”减号的情况。

在这种情况下抛出

FormatException
错误:

using System.Globalization;

private void textBox15_TextChanged(object sender, EventArgs e)
    {
        if (!string.IsNullOrEmpty(textBox14.Text)
             && !string.IsNullOrEmpty(textBox15.Text)
            )
        {
            double d1 = ConvertToNumber(textBox14.Text);
            double d2 = ConvertToNumber(textBox15.Text);

            double all = d1 + d2;

            textBox19.Text = all.ToString("n2");
        }
    }

    private double ConvertToNumber(string d1)
    {
        return double.Parse(d1, NumberStyles.Any, CultureInfo.InvariantCulture);
    }

这解决了它:

 using System.Globalization;

    private void textBox15_TextChanged(object sender, EventArgs e)
    {
        if (!string.IsNullOrEmpty(textBox14.Text)
             && !string.IsNullOrEmpty(textBox15.Text)
            )
        {
            if (textBox15.Text == "-")
            {
                return;
            }
            else
            {
                double d1 = ConvertToNumber(textBox14.Text);
                double d2 = ConvertToNumber(textBox15.Text);

                double all = d1 + d2;

                textBox19.Text = all.ToString("n2");
            }
        }
    }

    private double ConvertToNumber(string d1)
    {
        return double.Parse(d1, NumberStyles.Any, CultureInfo.InvariantCulture);
    }
© www.soinside.com 2019 - 2024. All rights reserved.