c# - Lebegőpontos szám elemzése: Van-e Catch All algoritmus?

original title: "c# - Floating Point Number parsing: Is there a Catch All algorithm?"


One of the fun parts of multi-cultural programming is number formats.

  • Americans use 10,000.50
  • Germans use 10.000,50
  • French use 10 000,50

My first approach would be to take the string, parse it backwards until I encounter a separator and use this as my decimal separator. There is an obvious flaw with that: 10.000 would be interpreted as 10.

Another approach: if the string contains 2 different non-numeric characters, use the last one as the decimal separator and discard the others. If I only have one, check if it occurs more than once and discards it if it does. If it only appears once, check if it has 3 digits after it. If yes, discard it, otherwise, use it as decimal separator.

The obvious "best solution" would be to detect the User's culture or Browser, but that does not work if you have a Frenchman using an en-US Windows/Browser.

Does the .net Framework contain some mythical black magic floating point parser that is better than Double.(Try)Parse() in trying to auto-detect the number format?

A multikulturális programozás egyik szórakoztató része a számformátumok. Az amerikaiak 10 000,50 németet használnak 10 000,50 franciát használnak 10 000,50-et. Az első megközelítésem az lenne, ha meghúzzam a húrot, elemezzem ...

Ez az összefoglalás a fordítás után. Ha meg szeretné tekinteni a teljes fordítást, kattintson a "fordítás" ikonra

Minden válasz
  • Translate

    I think the best you can do in this case is to take their input and then show them what you think they meant. If they disagree, show them the format you're expecting and get them to enter it again.

  • Translate

    I don't know the ASP.NET side of the problem but .NET has a pretty powerful class: System.Globalization.CultureInfo. You can use the following code to parse a string containing a double value:

    double d = double.Parse("100.20", CultureInfo.CurrentCulture);
    //  -- OR --
    double d = double.Parse("100.20", CultureInfo.CurrentUICulture);

    If ASP.NET somehow (i.e. using HTTP Request headers) passes current user's CultureInfo to either CultureInfo.CurrentCulture or CultureInfo.CurrentUICulture, these will work fine.

  • Translate

    You can't please everyone. If I enter ten as 10.000, and someone enters ten thousand as 10.000, you cannot handle that without some knowledge of the culture of the input. Detect the culture somehow (browser, system setting - what is the use case? ASP? Internal app, or open to the world?), or provide an example of the expected formatting, and use the most lenient parser you can. Probably something like:

    double d = Double.Parse("5,000.00", NumberStyles.Any, CultureInfo.InvariantCulture);

  • Translate

    The difference between 12.345 in French and English is a factor of 1000. If you supply an expected range where max < 1000*min, you can easily guess.

    Take for example the height of a person (including babies and children) in mm.

    By using a range of 200-3000, an input of 1.800 or 1,800 can unambiguously be interpreted as 1 meter and 80 centimeters, whereas an input of 912.300 or 912,300 can unambiguously be interpreted as 91 centimeters and 2.3 millimeters.