Desimaltall parsing: Er det en Catch All algoritme?

stemmer
56

En av de morsomme delene av flerkulturell programmering er tallformater.

  • Amerikanerne bruker 10,000.50
  • Tyskerne bruker 10.000,50
  • French bruk 10 000,50

Min første tilnærming ville være å ta strengen, analysere den bakover, før jeg møter en separator og bruke dette som min desimaltegn. Det er en åpenbar svakhet med at: 10.000 ville bli tolket som 10.

En annen tilnærming: hvis strengen inneholder 2 forskjellige ikke-numeriske tegn, bruker den siste som desimaltegn, og forkaste de andre. Hvis jeg bare har en, sjekk om det forekommer mer enn én gang og kast den hvis den gjør det. Hvis det vises bare en gang, sjekk om det har 3 siffer etter det. Hvis ja, kast den, ellers bruker det som desimaltegn.

Den åpenbare beste løsningen ville være å oppdage bruker kultur eller Browser, men det fungerer ikke hvis du har en franskmann ved hjelp av en en-US Windows / Browser.

Har .NET Framework inneholder noen mytiske svart magi flyttall parser som er bedre enn Double.(Try)Parse()å prøve å automatisk oppdage tallformatet?

Publisert på 01/08/2008 klokken 19:23
kilden bruker
På andre språk...                            


4 svar

stemmer
27

Jeg tror det beste du kan gjøre i dette tilfellet er å ta deres innspill og deretter vise dem hva du tror de mente. Hvis de er uenige, vise dem det formatet du venter, og få dem til å skrive det inn på nytt.

Svarte 01/08/2008 kl. 23:17
kilden bruker

stemmer
27

Jeg vet ikke ASP.NET siden av problemet, men .NET har en ganske kraftig klasse: System.Globalization.CultureInfo . Du kan bruke følgende kode for å analysere en streng som inneholder en dobbel verdi:

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

Hvis ASP.NET eller annen måte (dvs. ved hjelp av HTTP Request overskrifter) passerer gjeldende brukerens Culture til enten CultureInfo.CurrentCulture eller CultureInfo.CurrentUICulture, vil disse fungere fint.

Svarte 01/08/2008 kl. 20:02
kilden bruker

stemmer
12

Du kan ikke gjøre alle til lags. Hvis jeg kommer inn ti som 10.000, og noen kommer inn ti tusen som 10,000, kan du ikke håndtere det uten noe kjennskap til kulturen i input. Oppdage kulturen eller annen måte (nettleser, system setting -?? Hva er vitsen tilfelle ASP Intern app, eller åpen for verden), eller gi et eksempel på den forventede formatering, og bruker den mest skånsom parser du kan. Sannsynligvis noe sånt som:

double d = Double.Parse("5,000.00", NumberStyles.Any, CultureInfo.InvariantCulture);
Svarte 01/08/2008 kl. 20:05
kilden bruker

stemmer
10

Forskjellen mellom 12,345 på fransk og engelsk er en faktor på 1000. Hvis du leverer et forventet område hvor max <1000 * min, kan du enkelt gjette.

Ta for eksempel høyden på en person (inkludert spedbarn og barn) i mm.

Ved å bruke en rekke 200-3000, kan en inngang til 1,800 eller 1,800 entydig kan tolkes som en meter og 80 centimeter, mens en inngang på 912,300 eller 912,300 entydig kan tolkes som 91 cm og 2,3 mm.

Svarte 02/08/2008 kl. 12:28
kilden bruker

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