using System; using System.Collections.Generic; using System.Text; using System.ComponentModel; using FastReport.Utils; using System.Globalization; namespace FastReport.Format { /// /// Defines how percent values are formatted and displayed. /// public class PercentFormat : FormatBase { #region Fields private bool useLocale; private int decimalDigits; private string decimalSeparator; private string groupSeparator; private string percentSymbol; private int positivePattern; private int negativePattern; #endregion #region Properties /// /// Gets or sets a value that determines whether to use system locale settings to format a value. /// [DefaultValue(true)] public bool UseLocale { get { return useLocale; } set { useLocale = value; } } /// /// Gets or sets the number of decimal places to use in percent values. /// [DefaultValue(2)] public int DecimalDigits { get { return decimalDigits; } set { decimalDigits = value; } } /// /// Gets or sets the string to use as the decimal separator in percent values. /// public string DecimalSeparator { get { return decimalSeparator; } set { decimalSeparator = value; } } /// /// Gets or sets the string that separates groups of digits to the left of the decimal in percent values. /// public string GroupSeparator { get { return groupSeparator; } set { groupSeparator = value; } } /// /// Gets or sets the string to use as the percent symbol. /// public string PercentSymbol { get { return percentSymbol; } set { percentSymbol = value; } } /// /// Gets or sets the format pattern for positive percent values. /// /// This property can have one of the values in the following table. /// The symbol "%" is the PercentSymbol and n is a number. /// /// ValueAssociated Pattern /// 0n % /// 1n% /// 2%n /// 3% n /// /// [DefaultValue(0)] public int PositivePattern { get { return positivePattern; } set { positivePattern = value; } } /// /// Gets or sets the format pattern for negative percent values. /// /// This property can have one of the values in the following table. /// The symbol "%" is the PercentSymbol and n is a number. /// /// ValueAssociated Pattern /// 0 -n % /// 1 -n% /// 2 -%n /// 3 %-n /// 4 %n- /// 5 n-% /// 6 n%- /// 7 -%n /// 8 n %- /// 9 % n- /// 10% -n /// 11n- % /// /// [DefaultValue(0)] public int NegativePattern { get { return negativePattern; } set { negativePattern = value; } } #endregion #region Public Methods /// public override FormatBase Clone() { PercentFormat result = new PercentFormat(); result.UseLocale = UseLocale; result.DecimalDigits = DecimalDigits; result.DecimalSeparator = DecimalSeparator; result.GroupSeparator = GroupSeparator; result.PercentSymbol = PercentSymbol; result.PositivePattern = PositivePattern; result.NegativePattern = NegativePattern; return result; } /// public override bool Equals(object obj) { PercentFormat f = obj as PercentFormat; return f != null && UseLocale == f.UseLocale && DecimalDigits == f.DecimalDigits && DecimalSeparator == f.DecimalSeparator && GroupSeparator == f.GroupSeparator && PercentSymbol == f.PercentSymbol && PositivePattern == f.PositivePattern && NegativePattern == f.NegativePattern; } /// public override int GetHashCode() { return base.GetHashCode(); } /// public override string FormatValue(object value) { if (value is Variant) value = ((Variant)value).Value; return String.Format(GetNumberFormatInfo(), "{0:p}", new object[] { value }); } internal NumberFormatInfo GetNumberFormatInfo() { NumberFormatInfo info = new NumberFormatInfo(); if (UseLocale) { NumberFormatInfo cultureFormat = CultureInfo.CurrentCulture.NumberFormat; info.PercentDecimalDigits = DecimalDigits; info.PercentDecimalSeparator = cultureFormat.PercentDecimalSeparator; info.PercentGroupSizes = cultureFormat.PercentGroupSizes; info.PercentGroupSeparator = cultureFormat.PercentGroupSeparator; info.PercentSymbol = cultureFormat.PercentSymbol; info.PercentPositivePattern = cultureFormat.PercentPositivePattern; info.PercentNegativePattern = cultureFormat.PercentNegativePattern; } else { info.PercentDecimalDigits = DecimalDigits; info.PercentDecimalSeparator = DecimalSeparator; info.PercentGroupSizes = new int[] { 3 }; info.PercentGroupSeparator = GroupSeparator; info.PercentSymbol = PercentSymbol; info.PercentPositivePattern = PositivePattern; info.PercentNegativePattern = NegativePattern; } return info; } internal override string GetSampleValue() { return FormatValue(1.23f); } internal override void Serialize(FRWriter writer, string prefix, FormatBase format) { base.Serialize(writer, prefix, format); PercentFormat c = format as PercentFormat; if (c == null || UseLocale != c.UseLocale) writer.WriteBool(prefix + "UseLocale", UseLocale); if (c == null || DecimalDigits != c.DecimalDigits) writer.WriteInt(prefix + "DecimalDigits", DecimalDigits); if (!UseLocale) { if (c == null || DecimalSeparator != c.DecimalSeparator) writer.WriteStr(prefix + "DecimalSeparator", DecimalSeparator); if (c == null || GroupSeparator != c.GroupSeparator) writer.WriteStr(prefix + "GroupSeparator", GroupSeparator); if (c == null || PercentSymbol != c.PercentSymbol) writer.WriteStr(prefix + "PercentSymbol", PercentSymbol); if (c == null || PositivePattern != c.PositivePattern) writer.WriteInt(prefix + "PositivePattern", PositivePattern); if (c == null || NegativePattern != c.NegativePattern) writer.WriteInt(prefix + "NegativePattern", NegativePattern); } } #endregion /// /// Initializes a new instance of the PercentFormat class with default settings. /// public PercentFormat() { UseLocale = true; DecimalDigits = 2; DecimalSeparator = "."; GroupSeparator = ","; PercentSymbol = "%"; } } }