Vra

Een van die prettige dele van multikulturele programmering is getalformate.

  • Amerikaners gebruik 10 000,50
  • Duitsers gebruik 10 000,50
  • Franse gebruik 10 000,50

My eerste benadering sou wees om die string te neem, dit agteruit te ontleed totdat ek 'n skeier teëkom en dit as my desimale skeier te gebruik.Daar is 'n ooglopende fout daarmee:10 000 sal as 10 geïnterpreteer word.

Nog 'n benadering:as die string 2 verskillende nie-numeriese karakters bevat, gebruik die laaste een as die desimale skeiding en gooi die ander weg.As ek net een het, kyk of dit meer as een keer voorkom en gooi dit weg as dit gebeur.As dit net een keer verskyn, kyk of dit 3 syfers daarna het.Indien wel, gooi dit weg, anders gebruik dit as desimale skeiding.

Die ooglopende "beste oplossing" sal wees om die gebruiker se kultuur of blaaier op te spoor, maar dit werk nie as jy 'n Fransman het wat 'n en-US Windows/Blaaier gebruik nie.

Bevat die .net-raamwerk een of ander mitiese swart magiese drywende punt-ontleder wat beter is as Double.(Try)Parse() probeer om die getalformaat outomaties op te spoor?

Was dit nuttig?

Oplossing

Ek dink die beste wat jy in hierdie geval kan doen, is om hul insette te neem en dan vir hulle te wys wat jy dink hulle bedoel het.As hulle nie saamstem nie, wys hulle die formaat wat jy verwag en kry hulle om dit weer in te voer.

Ander wenke

Ek ken nie die ASP.NET-kant van die probleem nie, maar .NET het 'n redelik kragtige klas: System.Globalization.CultureInfo.Jy kan die volgende kode gebruik om 'n string te ontleed wat 'n dubbele waarde bevat:

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

As ASP.NET op een of ander manier (d.w.s.met behulp van HTTP-versoekopskrifte) stuur huidige gebruiker se CultureInfo na óf CultureInfo.CurrentCulture óf CultureInfo.CurrentUICulture, dit sal goed werk.

Jy kan nie almal tevrede stel nie.As ek tien as 10.000 invoer, en iemand voer tienduisend as 10.000 in, kan jy dit nie hanteer sonder enige kennis van die kultuur van die insette nie.Bespeur die kultuur op een of ander manier (blaaier, stelselinstelling - wat is die gebruiksgeval?ASP?Interne toepassing, of oop vir die wêreld?), of verskaf 'n voorbeeld van die verwagte formatering, en gebruik die mees toegeeflike ontleder wat jy kan.Waarskynlik iets soos:

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

Die verskil tussen 12.345 in Frans en Engels is 'n faktor van 1000.As jy 'n verwagte reeks verskaf waar maksimum < 1000*min., kan jy maklik raai.

Neem byvoorbeeld die lengte van 'n persoon (insluitend babas en kinders) in mm.

Deur 'n reeks van 200-3000 te gebruik, kan 'n inset van 1,800 of 1,800 ondubbelsinnig geïnterpreteer word as 1 meter en 80 sentimeter, terwyl 'n inset van 912,300 of 912,300 ondubbelsinnig as 91 sentimeter en 2,3 millimeter geïnterpreteer kan word.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top