2 // System.Globalization.RegionInfo.cs
5 // Atsushi Enomoto <atsushi@ximian.com>
9 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 using System
.Globalization
;
31 using System
.Runtime
.CompilerServices
;
33 namespace System
.Globalization
35 [System
.Runtime
.InteropServices
.ComVisible(true)]
37 public class RegionInfo
39 static RegionInfo currentRegion
;
41 // This property is not synchronized with CurrentCulture, so
42 // we need to use bootstrap CurrentCulture LCID.
43 public static RegionInfo CurrentRegion
{
45 if (currentRegion
== null) {
46 // make sure to fill BootstrapCultureID.
47 CultureInfo ci
= CultureInfo
.CurrentCulture
;
48 // If current culture is invariant then region is not available.
49 if (ci
== null || CultureInfo
.BootstrapCultureID
== 0x7F)
51 currentRegion
= new RegionInfo (CultureInfo
.BootstrapCultureID
);
57 int lcid
; // it is used only for Equals() (not even used in GetHashCode()).
59 #pragma warning disable 649
65 string currencySymbol
;
66 string isoCurrencySymbol
;
67 string currencyEnglishName
;
68 #pragma warning restore 649
70 public RegionInfo (int culture
)
72 if (!GetByTerritory (CultureInfo
.GetCultureInfo (culture
)))
73 throw new ArgumentException (
74 String
.Format ("Region ID {0} (0x{0:X4}) is not a supported region.", culture
), "culture");
77 public RegionInfo (string name
)
80 throw new ArgumentNullException ();
82 if (construct_internal_region_from_name (name
.ToUpperInvariant ())) {
83 lcid
= name
.GetHashCode (); // random-ish
86 if (!GetByTerritory (CultureInfo
.GetCultureInfo (name
)))
87 throw new ArgumentException (String
.Format ("Region name {0} is not supported.", name
), "name");
90 bool GetByTerritory (CultureInfo ci
)
93 throw new Exception ("INTERNAL ERROR: should not happen.");
94 if (ci
.IsNeutralCulture
|| ci
.Territory
== null)
97 return construct_internal_region_from_name (ci
.Territory
.ToUpperInvariant ());
100 [MethodImplAttribute (MethodImplOptions
.InternalCall
)]
101 private extern bool construct_internal_region_from_name (string name
);
103 [System
.Runtime
.InteropServices
.ComVisible(false)]
104 public virtual string CurrencyEnglishName
{
105 get { return currencyEnglishName; }
108 public virtual string CurrencySymbol
{
109 get { return currencySymbol; }
112 [MonoTODO ("DisplayName currently only returns the EnglishName")]
113 public virtual string DisplayName
{
114 get { return englishName; }
117 public virtual string EnglishName
{
118 get { return englishName; }
121 [System
.Runtime
.InteropServices
.ComVisible(false)]
122 public virtual int GeoId
{
123 get { return regionId; }
126 public virtual bool IsMetric
{
138 public virtual string ISOCurrencySymbol
{
139 get { return isoCurrencySymbol; }
142 [System
.Runtime
.InteropServices
.ComVisible(false)]
143 public virtual string NativeName
{
144 get { return DisplayName; }
147 [MonoTODO ("Not implemented")]
148 [System
.Runtime
.InteropServices
.ComVisible(false)]
149 public virtual string CurrencyNativeName
{
150 get { throw new NotImplementedException (); }
153 public virtual string Name
{
154 get { return iso2Name; }
157 public virtual string ThreeLetterISORegionName
{
158 get { return iso3Name; }
161 public virtual string ThreeLetterWindowsRegionName
{
162 get { return win3Name; }
165 public virtual string TwoLetterISORegionName
{
166 get { return iso2Name; }
172 public override bool Equals (object value)
174 RegionInfo other
= value as RegionInfo
;
175 return other
!= null && lcid
== other
.lcid
;
178 public override int GetHashCode ()
180 return (int) (0x80000000 + (regionId
<< 3) + regionId
); // it i still based on regionId
183 public override string ToString ()