{"record":{"id":"6ac3cbe5e77d77bf","repo":"dotnet/wpf","slug":"sr-specificnumberculturerequired","errorCode":null,"errorMessage":"SR.SpecificNumberCultureRequired","messagePattern":"SR\\.SpecificNumberCultureRequired","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/Media/textformatting/NumberSubstitution.cs","lineNumber":83,"sourceCode":"        /// </summary>\n        [TypeConverter(typeof(System.Windows.CultureInfoIetfLanguageTagConverter))]\n        public CultureInfo CultureOverride\n        {\n            get { return _cultureOverride; }\n            set { _cultureOverride = ThrowIfInvalidCultureOverride(value); }\n        }\n\n        /// <summary>\n        /// Helper function to throw an exception if invalid value is specified for\n        /// CultureOverride property.\n        /// </summary>\n        /// <param name=\"culture\">Culture to validate.</param>\n        /// <returns>The value of the culture parameter.</returns>\n        private static CultureInfo ThrowIfInvalidCultureOverride(CultureInfo culture)\n        {\n            if (!IsValidCultureOverride(culture))\n            {\n                throw new ArgumentException(SR.SpecificNumberCultureRequired);\n            }\n            return culture;\n        }\n\n        /// <summary>\n        /// Determines whether the specific culture is a valid value for the \n        /// CultureOverride property.\n        /// </summary>\n        /// <param name=\"culture\">Culture to validate.</param>\n        /// <returns>Returns true if it's a valid CultureOverride, false if not.</returns>\n        private static bool IsValidCultureOverride(CultureInfo culture)\n        {\n            // Null culture override is OK, but otherwise it must be a specific culture.\n            return\n                (culture == null) ||\n                !(culture.IsNeutralCulture || culture.Equals(CultureInfo.InvariantCulture));\n        }\n","sourceCodeStart":65,"sourceCodeEnd":101,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/Media/textformatting/NumberSubstitution.cs#L65-L101","documentation":"NumberSubstitution.ThrowIfInvalidCultureOverride requires the CultureOverride to be a specific (non-neutral, non-invariant) CultureInfo; otherwise it throws ArgumentException(SR.SpecificNumberCultureRequired). CultureOverride must identify an exact culture like 'fr-FR', not 'fr' or the invariant culture.","triggerScenarios":"Setting NumberSubstitution.CultureOverride to a neutral culture (e.g. new CultureInfo(\"fr\")), CultureInfo.InvariantCulture, an empty culture, or passing such a culture to the NumberSubstitution constructor.","commonSituations":"Deriving the culture from a language code that only has two letters (e.g. 'en', 'de'); using Thread.CurrentThread.CurrentUICulture when it is neutral; config storing 'invariant' as the override; parsing locale strings that lost their region suffix.","solutions":["Set CultureOverride to a specific culture with a region, e.g. new CultureInfo(\"fr-FR\") instead of \"fr\"","Validate before assigning: a culture is valid when it's non-null, not invariant, and not neutral (culture.IsNeutralCulture == false)","If only a language code is available, expand it to a default specific culture (e.g. \"en\" -> \"en-US\")","Catch ArgumentException around the property/constructor set and fall back to CultureSource-based resolution"],"exampleFix":"// before\nnumberSubstitution.CultureOverride = new CultureInfo(\"fr\"); // neutral culture\n// after\nvar culture = new CultureInfo(\"fr-FR\"); // specific culture\nnumberSubstitution.CultureOverride = culture;","handlingStrategy":"validation","validationCode":"if (culture == null || culture.Equals(CultureInfo.InvariantCulture) || culture.IsNeutralCulture)\n    culture = CultureInfo.CreateSpecificCulture(culture?.Name ?? \"en\");","typeGuard":"bool IsValidCultureOverride(CultureInfo c) => c != null && !c.Equals(CultureInfo.InvariantCulture) && !c.IsNeutralCulture;","tryCatchPattern":"try { numberSubstitution.CultureOverride = culture; }\ncatch (ArgumentException ex) { log.Warn(\"CultureOverride must be specific, falling back\", ex); numberSubstitution.CultureSource = NumberCultureSource.AsCulture; }","preventionTips":["Always use specific cultures ('fr-FR'), never neutral ('fr')","Expand two-letter language codes with CultureInfo.CreateSpecificCulture","Validate culture override whenever it originates from user input or config"],"tags":["wpf","textformatting","culture","globalization"],"backgroundTag":"invalid-argument-value","analyzedSha":"81131a70a4c573cd62748a5c36908fc4d662daa9","analyzedAt":"2026-09-14T10:12:48.479Z","contentChangedAt":"2026-09-14T10:12:48.479Z","schemaVersion":2},"datasetVersion":"2026-09-21T21:30:21.729Z"}