using System; using System.Collections.Generic; using System.Text; using System.ComponentModel; using FastReport.Utils; using System.Globalization; namespace FastReport.Format { /// /// Defines how currency values are formatted and displayed. /// public class CurrencyFormat : FormatBase { #region Fields private bool useLocale; private int decimalDigits; private string decimalSeparator; private string groupSeparator; private string currencySymbol; 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 currency values. /// [DefaultValue(2)] public int DecimalDigits { get { return decimalDigits; } set { decimalDigits = value; } } /// /// Gets or sets the string to use as the decimal separator in currency 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 currency values. /// public string GroupSeparator { get { return groupSeparator; } set { groupSeparator = value; } } /// /// Gets or sets the string to use as the currency symbol. /// public string CurrencySymbol { get { return currencySymbol; } set { currencySymbol = value; } } /// /// Gets or sets the format pattern for positive currency values. /// /// This property can have one of the values in the following table. /// The symbol "$" is the CurrencySymbol and n is a number. /// /// ValueAssociated Pattern /// 0$n /// 1n$ /// 2$ n /// 3n $ /// /// [DefaultValue(0)] public int PositivePattern { get { return positivePattern; } set { positivePattern = value; } } /// /// Gets or sets the format pattern for negative currency values. /// /// This property can have one of the values in the following table. /// The symbol "$" is the CurrencySymbol 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 /// 10n $- /// 11$ n- /// 12$ -n /// 13n- $ /// 14($ n) /// 15(n $) /// /// [DefaultValue(0)] public int NegativePattern { get { return negativePattern; } set { negativePattern = value; } } #endregion #region Public Methods /// public override FormatBase Clone() { CurrencyFormat result = new CurrencyFormat(); result.UseLocale = UseLocale; result.DecimalDigits = DecimalDigits; result.DecimalSeparator = DecimalSeparator; result.GroupSeparator = GroupSeparator; result.CurrencySymbol = CurrencySymbol; result.PositivePattern = PositivePattern; result.NegativePattern = NegativePattern; return result; } /// public override bool Equals(object obj) { CurrencyFormat f = obj as CurrencyFormat; return f != null && UseLocale == f.UseLocale && DecimalDigits == f.DecimalDigits && DecimalSeparator == f.DecimalSeparator && GroupSeparator == f.GroupSeparator && CurrencySymbol == f.CurrencySymbol && 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:c}", new object[] { value }); } internal NumberFormatInfo GetNumberFormatInfo() { NumberFormatInfo info = new NumberFormatInfo(); if (UseLocale) { NumberFormatInfo cultureFormat = CultureInfo.CurrentCulture.NumberFormat; info.CurrencyDecimalDigits = DecimalDigits; info.CurrencyDecimalSeparator = cultureFormat.CurrencyDecimalSeparator; info.CurrencyGroupSizes = cultureFormat.CurrencyGroupSizes; info.CurrencyGroupSeparator = cultureFormat.CurrencyGroupSeparator; info.CurrencySymbol = cultureFormat.CurrencySymbol; info.CurrencyPositivePattern = cultureFormat.CurrencyPositivePattern; info.CurrencyNegativePattern = cultureFormat.CurrencyNegativePattern; } else { info.CurrencyDecimalDigits = DecimalDigits; info.CurrencyDecimalSeparator = DecimalSeparator; info.CurrencyGroupSizes = new int[] { 3 }; info.CurrencyGroupSeparator = GroupSeparator; info.CurrencySymbol = CurrencySymbol; info.CurrencyPositivePattern = PositivePattern; info.CurrencyNegativePattern = NegativePattern; } return info; } internal override string GetSampleValue() { return FormatValue(-12345); } internal override void Serialize(FRWriter writer, string prefix, FormatBase format) { base.Serialize(writer, prefix, format); CurrencyFormat c = format as CurrencyFormat; 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 || CurrencySymbol != c.CurrencySymbol) writer.WriteStr(prefix + "CurrencySymbol", CurrencySymbol); 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 CurrencyFormat class with default settings. /// public CurrencyFormat() { UseLocale = true; DecimalDigits = 2; DecimalSeparator = "."; GroupSeparator = ","; CurrencySymbol = "$"; } } }