【问题标题】:Is a C# decimal cultural dependent是 C# 十进制文化依赖
【发布时间】:2017-04-13 05:34:37
【问题描述】:

我正在查看其他开发人员的一些代码,我发现一些看起来……丑陋且不必要的代码。

我了解在解析字符串时,我们需要正确使用文化信息,否则您可能会遇到“1.2”与“1,2”类型的问题。在这种情况下,开发人员使用的是存储为小数的 NumericUpDown。

float fValue = System.Convert.ToSingle(numericUpDown1.Value, System.Globalization.CultureInfo.InvariantCulture)

我的问题是: - 以下代码是否等效? - 文化信息会得到妥善处理吗?
- 这个演员表会抛出异常吗?

float fValue = (float)numericUpDown1.Value;

如果它们不等效(或安全),您能否解释原因并提出“正确”的解决方案?

提前致谢!

【问题讨论】:

    标签: c# .net culture


    【解决方案1】:

    Convert.ToSingle(value, culture) 呼叫((IConvertible)value).ToSingle(culture)。 decimal 的IConvertible.ToSingle 然后忽略传入的文化并返回Convert.ToSingle(value),它只返回(float)value。

    是的,您的代码是等效的。

    【讨论】:

    • "然后忽略传入的文化" 它不会忽略它。而是执行重载Convert.ToDouble(Object, IFormatProvider)。
    • @user2190035 呃……什么?不,不,Convert.ToDouble 不会参与到float/Single 的转换。如果您不相信float IConvertible.ToSingle(IFormatProvider provider) 会像我在回答中写的那样忽略provider,请检查the reference source。
    【解决方案2】:

    是的,仅当 numericupdown1 值较小时,您的代码才等效于该代码。 但如果该值为 41.00027357629127 或类似的值,它将返回 4.10002732E+15。

    所以,通过使用 float.Parse("numericUpDown1.Value", CultureInfo.InvariantCulture.NumberFormat);你可以得到准确的值

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多