// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. using System.Diagnostics; namespace System.Globalization { /// /// This class represents settings specified by de jure or de facto /// standards for a particular country/region. In contrast to /// CultureInfo, the RegionInfo does not represent preferences of the /// user and does not depend on the user's language or culture. /// public class RegionInfo { // Name of this region (ie: es-US): serialized, the field used for deserialization private string _name; // The CultureData instance that we are going to read data from. private readonly CultureData _cultureData; // The RegionInfo for our current region internal static volatile RegionInfo? s_currentRegionInfo; public RegionInfo(string name) { if (name == null) { throw new ArgumentNullException(nameof(name)); } // The InvariantCulture has no matching region if (name.Length == 0) { throw new ArgumentException(SR.Argument_NoRegionInvariantCulture, nameof(name)); } // For CoreCLR we only want the region names that are full culture names _cultureData = CultureData.GetCultureDataForRegion(name, true) ?? throw new ArgumentException(SR.Format(SR.Argument_InvalidCultureName, name), nameof(name)); // Not supposed to be neutral if (_cultureData.IsNeutralCulture) { throw new ArgumentException(SR.Format(SR.Argument_InvalidNeutralRegionName, name), nameof(name)); } _name = _cultureData.RegionName; } public RegionInfo(int culture) { // The InvariantCulture has no matching region if (culture == CultureInfo.LOCALE_INVARIANT) { throw new ArgumentException(SR.Argument_NoRegionInvariantCulture); } if (culture == CultureInfo.LOCALE_NEUTRAL) { // Not supposed to be neutral throw new ArgumentException(SR.Format(SR.Argument_CultureIsNeutral, culture), nameof(culture)); } if (culture == CultureInfo.LOCALE_CUSTOM_DEFAULT) { // Not supposed to be neutral throw new ArgumentException(SR.Format(SR.Argument_CustomCultureCannotBePassedByNumber, culture), nameof(culture)); } _cultureData = CultureData.GetCultureData(culture, true); _name = _cultureData.RegionName; if (_cultureData.IsNeutralCulture) { // Not supposed to be neutral throw new ArgumentException(SR.Format(SR.Argument_CultureIsNeutral, culture), nameof(culture)); } } internal RegionInfo(CultureData cultureData) { _cultureData = cultureData; _name = _cultureData.RegionName; } /// /// This instance provides methods based on the current user settings. /// These settings are volatile and may change over the lifetime of the /// public static RegionInfo CurrentRegion { get { RegionInfo? temp = s_currentRegionInfo; if (temp == null) { temp = new RegionInfo(CultureInfo.CurrentCulture._cultureData); // Need full name for custom cultures temp._name = temp._cultureData.RegionName; s_currentRegionInfo = temp; } return temp; } } /// /// Returns the name of the region (ie: en-US) /// public virtual string Name { get { Debug.Assert(_name != null, "Expected RegionInfo._name to be populated already"); return _name; } } /// /// Returns the name of the region in English. (ie: United States) /// public virtual string EnglishName => _cultureData.EnglishCountryName; /// /// Returns the display name (localized) of the region. (ie: United States /// if the current UI language is en-US) /// public virtual string DisplayName => _cultureData.LocalizedCountryName; /// /// Returns the native name of the region. (ie: Deutschland) /// WARNING: You need a full locale name for this to make sense. /// public virtual string NativeName => _cultureData.NativeCountryName; /// /// Returns the two letter ISO region name (ie: US) /// public virtual string TwoLetterISORegionName => _cultureData.TwoLetterISOCountryName; /// /// Returns the three letter ISO region name (ie: USA) /// public virtual string ThreeLetterISORegionName => _cultureData.ThreeLetterISOCountryName; /// /// Returns the three letter windows region name (ie: USA) /// public virtual string ThreeLetterWindowsRegionName => ThreeLetterISORegionName; /// /// Returns true if this region uses the metric measurement system /// public virtual bool IsMetric => _cultureData.MeasurementSystem == 0; public virtual int GeoId => _cultureData.GeoId; /// /// English name for this region's currency, ie: Swiss Franc /// public virtual string CurrencyEnglishName => _cultureData.CurrencyEnglishName; /// /// Native name for this region's currency, ie: Schweizer Franken /// WARNING: You need a full locale name for this to make sense. /// public virtual string CurrencyNativeName => _cultureData.CurrencyNativeName; /// /// Currency Symbol for this locale, ie: Fr. or $ /// public virtual string CurrencySymbol => _cultureData.CurrencySymbol; /// /// ISO Currency Symbol for this locale, ie: CHF /// public virtual string ISOCurrencySymbol => _cultureData.ISOCurrencySymbol; /// /// Implements Object.Equals(). Returns a boolean indicating whether /// or not object refers to the same RegionInfo as the current instance. /// RegionInfos are considered equal if and only if they have the same name /// (ie: en-US) /// public override bool Equals(object? value) { return value is RegionInfo otherRegion && Name.Equals(otherRegion.Name); } public override int GetHashCode() => Name.GetHashCode(); public override string ToString() => Name; } }