windows - Hvordan formatere en dato/tid/nummer/valuta i en anden lokalitet?

Indlæg af Hanne Mølgaard Plasc

Problem



Hvordan formaterer jeg noget til en anden lokalitet i Windows?


For eksempel ville jeg i forsøget C # kode forsøge at gøre en DateTime ved hjælp af en-US locale med:


String s = DateTime.Now.ToString(CultureInfo.CreateSpecificCulture("en-US"));

TextRenderer.DrawText(
      e.Graphics, s, SystemFonts.IconTitleFont, 
      new Point(16, 16), SystemColors.ControlText);


Og det fungerer fint, når min computer s locale er en-US:


Indtast billedbeskrivelse her


Det virker også fint, når min computer s locale er de-DE:


Indtast billedbeskrivelse her


Men det falder helt fra hinanden, når min computer s locale er ps-AF:


Indtast billedbeskrivelse her


Bemærk: Min prøvekode er i .NET, men kan også være indfødt.





Opdater : Forsøger at indstille System.Threading.Thread.CurrentThread.CurrentCulture til en-US før du ringer til DrawText:


var oldCulture = System.Threading.Thread.CurrentThread.CurrentCulture;
System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
try
{
//  String s = DateTime.Now.ToString(CultureInfo.CreateSpecificCulture("en-US"));
    String s = DateTime.Now.ToString();
    TextRenderer.DrawText(e.Graphics, s, SystemFonts.IconTitleFont, new Point(16, 16), SystemColors.ControlText);
}
finally         
{
    System.Threading.Thread.CurrentThread.CurrentCulture = oldCulture;
}


Indtast billedbeskrivelse her


Ingen hjælp.



  • Ni, ingen hjælp

  • Jack, ingen hjælp

  • Otte, mulig lige

  • Konge, mulig flush

  • Ess, ingen hjælp

  • Seks, mulig lige

  • Dave af kærlighed til forhandleren



Ace bets.





Opdater to:


Fra Michael Kaplans blogbog:



  

Nogle gange respekterer GDI brugere (selvom ingen andre gør!)


  
  GDI giver ikke noget kig på formatering eller virkelig noget relateret til lokaliteter, med en enkelt undtagelse: [19]

  
   Digit substitution

  
  Hver gang du går for at gengive tekst, vil den få fat i disse cifret substitutionsindstillinger i brugerens lokalitet (herunder brugerens tilsidesættelsesoplysninger) og bruge info til at bestemme, hvordan man viser tal.

  
  Og der er ingen måde at tilsidesætte disse indstillinger på det niveau, hvor GDI bruger dem.



Jeg spekulerer på, hvordan Chrome administrerer det. Når jeg skriver cifre her, i Chrome-overførselsspørgsmålet, gør Chrome dem ved hjælp af latinske cifre:


0123456789


Se:


Indtast billedbeskrivelse her

Bedste reference


Det, du ser, skyldes den cifret substitution, der opstår, når dit system s locale er ps-AF. [20]


Jeg tror, ​​at det er OK - Brugere af en sådan lokalitet er vant til at se cifre præsenteret på denne måde.


Normalt er den måde, det gøres på, lidt anderledes, se her for eksempel, men jeg tror ikke, at det her skulle gøre nogen forskel: [21]


String s = DateTime.Now.ToString(new CultureInfo("en-US"));

Andre referencer 1


Et alternativ er at indstille Thread.CurrentCulture til din ønskede lokalitet.


Dvs. gør dette:


Thread.CurrentCulture = new CultureInfo("en-US");


Og du kan derefter erstatte den første linje i din kode med dette:


String s = DateTime.Now.ToString();


Jeg er ikke helt sikker på, men jeg mener, at dette ville løse cifret substitution problem som DrawText ville nu være baseret på en-US kultur, snarere end ps-AF