Floating Point Number parsing: Is er een Catch All algoritme?

stemmen
52

Een van de leuke kanten van de multi-culturele programmering is nummer formats.

  • Amerikanen gebruiken 10,000.50
  • Duitsers gebruiken 10.000,50
  • Fransen gebruiken 10 000,50

Mijn eerste benadering zou zijn om de string te nemen, ontleden naar achteren, totdat ik een separator tegenkomt en gebruik dit als mijn decimaal teken. Er is een duidelijke fout mee: 10,000 worden uitgelegd 10.

Een andere benadering: als de string bevat 2 verschillende niet-numerieke tekens, gebruik dan de laatste als decimaalteken en de anderen weg te gooien. Als ik slechts één, controleer dan of het gebeurt meer dan eens en gooi het als het doet. Als het slechts één keer weergegeven, controleer dan of het heeft 3 cijfers achter het. Zo ja, weggooien, anders gebruikt als decimaalteken.

De voor de hand liggende beste oplossing zou zijn om de cultuur of de browser van de gebruiker op te sporen, maar dat werkt niet als je een Fransman met behulp van een en-US Windows / Browser.

Heeft het .NET Framework bevatten enkele mythische zwarte magie floating point parser, dat is beter dan Double.(Try)Parse()in een poging om automatisch detecteren het aantal formaat?

De vraag is gesteld op 01/08/2008 om 20:23
bron van user
In andere talen...                            


4 antwoorden

stemmen
26

Ik denk dat het beste wat je kunt doen is in dit geval om hun inbreng te nemen en dan laten zien wat je denkt dat ze bedoelde. Als ze het niet eens, laat ze het formaat je verwacht en krijgen ze meer in te voeren.

antwoordde op 02/08/2008 om 00:17
bron van user

stemmen
26

Ik weet niet de ASP.NET kant van het probleem, maar .NET heeft een mooie krachtige klasse: System.Globalization.CultureInfo . U kunt de volgende code gebruiken om een string met een dubbele waarde ontleden:

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

Als ASP.NET of andere manier (dat wil zeggen met behulp van HTTP-verzoek headers) passeert CultureInfo huidige gebruiker om ofwel CultureInfo.CurrentCulture of CultureInfo.CurrentUICulture, zullen deze prima werken.

antwoordde op 01/08/2008 om 21:02
bron van user

stemmen
11

Je kunt niet iedereen tevreden stellen. Als ik tien invoeren als 10.000, en iemand komt tienduizend als 10.000, kun je dat niet aan, zonder enige kennis van de cultuur van de input. Detecteren de cultuur een of andere manier (browser, systeeminstellingen -??? Wat is het use case ASP Intern app, of open voor de wereld), of geef een voorbeeld van de verwachte opmaak, en het gebruik van de mildste parser je kunt. Waarschijnlijk iets als:

double d = Double.Parse("5,000.00", NumberStyles.Any, CultureInfo.InvariantCulture);
antwoordde op 01/08/2008 om 21:05
bron van user

stemmen
9

Het verschil tussen de 12.345 in het Frans en Engels is een factor van 1000. Als u een verwachte bereik max <1000 * min, kunt u gemakkelijk raden leveren.

Neem bijvoorbeeld de hoogte van een persoon (inclusief baby's en kinderen) in mm.

Door een reeks 200-3000, kan een invoer van 1.800 of 1.800 eenduidig ​​worden geïnterpreteerd als 1 meter en 80 centimeter, terwijl een ingang van 912,300 en 912.300 eenduidig ​​kan worden geïnterpreteerd als 91 cm en 2,3 mm.

antwoordde op 02/08/2008 om 13:28
bron van user

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more