【问题标题】:C# float.tryparse for French Culture用于法国文化的 C# float.tryparse
【发布时间】:2010-04-27 16:02:10
【问题描述】:

我有一个用户输入,其中包含的浮点值范围为:3.06 或 3,06 我们所处的文化是法语,因此当用户输入 3.06 并且我在该值上运行 float.tryParse 时,它​​不会转换为 3.06 到新变量(浮点类型)

// inputUsedAmount.Value from UI is : 3.06
float usedAmount = 0.0f;
float.TryParse(inputUsedAmount.Value, out usedAmount);
// returns false

我可以简单地替换从“。”从 UI 输入的金额。到“,”,但是通过 Culture 有没有一种优雅/更好的方式来做到这一点? 谢谢

【问题讨论】:

  • 拒绝“3.06”作为有效输入似乎是合理的——至少对我来说是这样。在法国(您甚至可以说,欧洲)“3,06”是一个有效数字,而“3.06”根本不是。您的应用程序是否还支持以下格式“MM/DD/YYYY”的日期,或者您/您会因为格式无效而拒绝此类日期吗?我认为是后者,而且相当合理。

标签: c# culture


【解决方案1】:

您可以使用采用格式提供程序的overload。你可以通过一个法国文化信息:

string value;
NumberStyles style;
CultureInfo culture;
double number;

value = "1345,978";
style = NumberStyles.AllowDecimalPoint;
culture = CultureInfo.CreateSpecificCulture("fr-FR");
if (Double.TryParse(value, style, culture, out number))
   Console.WriteLine("Converted '{0}' to {1}.", value, number);
else
   Console.WriteLine("Unable to convert '{0}'.", value);
// Displays:
//       Converted '1345,978' to 1345.978.

【讨论】:

  • 请注意此代码使用NumberStyles.AllowDecimalPoint。如果只指定AllowDecimalPoint,有些字符串将无法解析。例如,负数不起作用。默认情况下,TryParse 使用 NumberStyles.Float | NumberStyles.AllowThousandsNumberStyle.Float 本身就是Integer | AllowExponent | AllowDecimalPoint 的组合。
【解决方案2】:
float usedAmount;

// try parsing with "fr-FR" first
bool success = float.TryParse(inputUsedAmount.Value,
                              NumberStyles.Float | NumberStyles.AllowThousands,
                              CultureInfo.GetCultureInfo("fr-FR"),
                              out usedAmount);

if (!success)
{
    // parsing with "fr-FR" failed so try parsing with InvariantCulture
    success = float.TryParse(inputUsedAmount.Value,
                             NumberStyles.Float | NumberStyles.AllowThousands,
                             CultureInfo.InvariantCulture,
                             out usedAmount);
}

if (!success)
{
    // parsing failed with both "fr-FR" and InvariantCulture
}

【讨论】:

    【解决方案3】:

    您可以在TryParse 方法中传递文化:

    public static bool TryParse(string s, NumberStyles style, IFormatProvider provider, out float result);
    

    【讨论】:

    • 是的,但是我如何决定传递哪种文化,因为 UI 值可以是“。”或“,”
    • 您需要询问用户(或以其他方式确定)他们所在的语言环境。大多数系统都有用于确定当前文化的设置。那么,您的问题是设计这样一个系统或确定客户文化的最佳方式吗?
    猜你喜欢
    • 2010-09-11
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多