tags:

views:

490

answers:

3

I have a user input which can contain float values ranging from : 3.06 OR 3,06 The culture we are in is French and thus when the user inputs 3.06 and I run a float.tryParse over this value it does not get converted to 3.06 into a new variable (type float)

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

I can simply do a replace on the amount entered from UI from "." to ",", but is there a graceful/better way of doing this through Culture ? Thanks

+1  A: 

You can pass culture inside TryParse method:

public static bool TryParse(string s, NumberStyles style, IFormatProvider provider, out float result);
Andrew Bezzub
Yes but how do i decide which culture to pass since the UI value can either be "." Or ","
Murtaza RC
You need to ask the user (or in some other way determine) which locale they are in. Most systems have a setting for determining the current culture. Is your question, then, the best way to devise such a system or determine the client's culture?
BlueMonkMN
+3  A: 

You can use the overload that takes a format provider. You can pass through a French culture info:

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.
Oded
A: 
float usedAmount;

// try parsing with "fr-FR" first
bool success = float.TryParse(inputUsedAmount.Value,
                              NumberStyles.Float | NumberStyles.AllowThousands,
                              new CultureInfo("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);
}
LukeH