internal static string Format(object value, ref Formatter formatter, Microsoft.ReportingServices.ReportIntermediateFormat.Style reportItemStyle, Microsoft.ReportingServices.ReportIntermediateFormat.Style reportElementStyle, OnDemandProcessingContext context, ObjectType objectType, string objectName) { if (formatter == null) { formatter = new Formatter(reportItemStyle, context, objectType, objectName); } TypeCode typeCode = Type.GetTypeCode(value.GetType()); bool sharedFormatSettings = false; string styleStringValue = ""; reportElementStyle?.GetStyleAttribute(objectType, objectName, "Format", context, ref sharedFormatSettings, out styleStringValue); return(formatter.FormatValue(value, styleStringValue, typeCode)); }
internal string FormatValue(object value, string formatString, TypeCode typeCode, bool addDateTimeOffsetSuffix) { CultureInfo formattingCulture = null; string styleStringValue = null; bool flag = false; bool isThreadCulture = false; bool flag2 = false; int num = 0; bool flag3 = false; string text = null; Calendar calendar = null; bool flag4 = false; try { if (m_styleClass != null) { if (formatString == null) { m_styleClass.GetStyleAttribute(m_objectType, m_objectName, "Format", m_context, ref m_sharedFormatSettings, out formatString); } num = m_styleClass.GetStyleAttribute(m_objectType, m_objectName, "Language", m_context, ref m_sharedFormatSettings, out styleStringValue); if (!GetCulture(styleStringValue, ref formattingCulture, ref isThreadCulture, ref num)) { text = RPRes.rsExpressionErrorValue; flag4 = true; } if (!flag4 && typeCode == TypeCode.DateTime && !m_calendarValidated) { CreateAndValidateCalendar(num, formattingCulture); } } if (!flag4 && formattingCulture != null && m_formattingCalendar != null) { if (isThreadCulture) { if (formattingCulture.DateTimeFormat.IsReadOnly) { formattingCulture = (CultureInfo)formattingCulture.Clone(); flag2 = true; } else { calendar = formattingCulture.DateTimeFormat.Calendar; } } formattingCulture.DateTimeFormat.Calendar = m_formattingCalendar; } if (!flag4 && formatString != null && value is IFormattable) { try { if (formattingCulture == null) { formattingCulture = Thread.CurrentThread.CurrentCulture; isThreadCulture = true; } if (ReportProcessing.CompareWithInvariantCulture(formatString, "x", ignoreCase: true) == 0) { flag3 = true; } text = ((IFormattable)value).ToString(formatString, formattingCulture); if (addDateTimeOffsetSuffix) { text += " +0".ToString(formattingCulture); } } catch (Exception ex) { text = RPRes.rsExpressionErrorValue; m_context.ErrorContext.Register(ProcessingErrorCode.rsInvalidFormatString, Severity.Warning, m_objectType, m_objectName, "Format", ex.Message); } flag4 = true; } if (!flag4) { CultureInfo cultureInfo = null; if ((!isThreadCulture && formattingCulture != null) || flag2) { cultureInfo = Thread.CurrentThread.CurrentCulture; Thread.CurrentThread.CurrentCulture = formattingCulture; try { text = value.ToString(); } finally { if (cultureInfo != null) { Thread.CurrentThread.CurrentCulture = cultureInfo; } } } else { text = value.ToString(); } } } finally { if (isThreadCulture && calendar != null) { Global.Tracer.Assert(!Thread.CurrentThread.CurrentCulture.DateTimeFormat.IsReadOnly, "(!System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat.IsReadOnly)"); Thread.CurrentThread.CurrentCulture.DateTimeFormat.Calendar = calendar; } } if (!flag3 && m_styleClass != null) { if ((uint)(typeCode - 5) <= 10u) { flag = true; } if (flag) { int styleIntValue = 1; m_styleClass.GetStyleAttribute(m_objectType, m_objectName, "NumeralVariant", m_context, ref m_sharedFormatSettings, out styleIntValue); if (styleIntValue > 2) { CultureInfo cultureInfo2 = formattingCulture; if (cultureInfo2 == null) { cultureInfo2 = Thread.CurrentThread.CurrentCulture; } string numberDecimalSeparator = cultureInfo2.NumberFormat.NumberDecimalSeparator; m_styleClass.GetStyleAttribute(m_objectType, m_objectName, "NumeralLanguage", m_context, ref m_sharedFormatSettings, out styleStringValue); if (styleStringValue != null) { formattingCulture = new CultureInfo(styleStringValue, useUserOverride: false); } else if (formattingCulture == null) { formattingCulture = cultureInfo2; } bool numberTranslated = true; text = FormatDigitReplacement.FormatNumeralVariant(text, styleIntValue, formattingCulture, numberDecimalSeparator, out numberTranslated); if (!numberTranslated) { m_context.ErrorContext.Register(ProcessingErrorCode.rsInvalidNumeralVariantForLanguage, Severity.Warning, m_objectType, m_objectName, "NumeralVariant", styleIntValue.ToString(CultureInfo.InvariantCulture), formattingCulture.Name); } } } } return(text); }